2009-08-05 11 views
5

şuna benzer bir kod yaklaşık 600'den fazla referanslara sahip her yerde ctl00_ koymadan kimliği ve ASP.NET tarafından... kod

$("#ctl00_ContentMainPane_eliteUser").html 

JQuery seçeneğini eleman kullanmak Ve usta şablonu değişti nasıl Sadece kontrol hiyerarşisinin değişmesi nedeniyle tüm kodların kırıldığını bulmak için.

ayrı dosyalarda dahil javascript

Tüm, bu yüzden bu gibi kod kullanamaz ...

$("#<%= eliteUser.clientID%>").html 

Bu sorunu düzeltmek için iyi bir çözüm istiyorsanız ki, ben don kez düzelttikten sonra Şablon gelecekte değişecekse tüm kodu değiştirmek zorunda.

+1

Burada daha fazla sorun tanımlanmıştır: http://stackoverflow.com/questions/1232641 – digiguru

cevap

8

Nasıl gibi efendin sayfasında bir JavaScript işlevi tanımlama hakkında: böyle bir şey yapmak için dahil JavaScript dosyalarında Sonra

function getContainerId() { 
    return "<%=ContentMainPane.ClientID %>"; 
} 

:

$("#" + getContainerId() + "_eliteUser"); 
1

Bildiğim kadarıyla, asp.net sınıf adlarına bulaşmaz. Denetiminize bir sınıf adı ekleyin ve bu ismi kodunuzda referans olarak kullanın.

$("input[id*=eliteUser]").html() 

Ama eliteUser kendi kimliklerini biten birden fazla denetim varsa - bu çalışmaz:

3

Her yol, her sayfanın en üstünde yazılan js değişkenleri nesnesi kullanmaktır. Harici j'leriniz daha sonra ayar nesnesine istenen özellik ile başvurabilir. Bu şekilde, harici js dosyalarında herhangi bir kod yazmadan aspx sayfalarınızdaki kimliği değiştirebilirsiniz.

Daha sonra, her sayfanın kontrol kimliği öğelerini bir listeye eklemesine izin veren bir malzeme sayfası veya temel sayfa yöntemi gösterebilirsiniz. Temel yöntem, her sayfanın üst kısmındaki pageVars komut dosyasını yazma sorumluluğuna sahiptir. Bu here

hakkında

Rick Strahl görüşmeler Hala hızlı seçicileri yararlanamadı olarak bu yöntemi tercih etmektedir. Örn

Eğer aspx aşağıdaki senaryoyu yazmaya alırsanız

. Harici js Sonra

var pageVars = { 
    idList: { 
     eliteUser : 'ctl00_ContentMainPane_eliteUser', 
     normalUser : 'ctl00_ContentMainPane_normalUser', 
     powerUser : 'ctl00_ContentMainPane_powerUser', 
     ..... 
    } 
}; 

$('#' + pageVars.idList.eliteUser) 
$('#' + pageVars.idList.powerUser)....etc 
0

Bu Visual Studio'nun bir sonraki sürümünde ele alındığını anladığım bir sorun, ancak bunun size yardımcı olamayacağının farkındayım.

$.extend({ 
    clientID: function(id) { 
     return $("[id$='_" + id + "']"); 
    } 
}); 

Ve kullandı kodu: Ben aslında yapmak WebControl genişleten bir sınıf kullanıyoruz

statusBar = $.clientID("MSS_MESS_LINE_Static") 
+0

Ancak, bir kimliği olan sayfadaki HER öğe üzerine yakınlaştırılacak ve ardından filtre uygulayacağından, köpek yavaş seçiciler ile biter. – redsquare

+0

"Görsel stüdyo" nun bunu nasıl çözeceğine dair bir bağlantınız var mı? veya .NET framework'ü mi kastediyorsunuz? – digiguru

+0

bu makalenin yarısına kadar http://www.mostlylucid.net/archive/2008/11/03/way-too-much-information-on-control-ids-and-asp.net-4.0.aspx – redsquare

2

projemize üzerinde ele yolu şey hattını bu oldu RedSquare's suggestion ile aynıdır. Ben suggestion on this blog

/// <summary> 
/// Custom Web control that renders two JavaScript functions out into the page 
/// so that defined control IDs can be used to get a reference to HTML DOM elements 
/// </summary> 
[DefaultProperty("Text")] 
[ToolboxData("<{0}:ClientIdHandler runat=\"server\"></{0}:ClientIdHandler>")] 
public class ClientIdHandler : WebControl 
{ 
    private StringBuilder _builder = new StringBuilder(); 

public ClientIdHandler(){} 


/// <summary> 
/// Renders the ClientID of the control in JavaScript function "clientId" to the specified writer. 
/// </summary> 
/// <param name="output">A <see cref="Control"/> whose ClientID will be included 
/// in the rendered HTML output.</param> 
public void AddControl(Control c) 
{ 
    _builder.AppendFormat(" case '{0}': return '{1}'; break;" + Environment.NewLine, c.ID, c.ClientID); 
} 

/// <summary> 
/// Overrides the Render method to prevent a Start and End <see cref="HtmlTextWriterTag"/> 
/// being rendered in the HTML for the control. 
/// </summary> 
/// <param name="output">A <see cref="HtmlTextWriter"/> that represents 
/// the output stream to render HTML content on the client.</param> 
protected override void Render(HtmlTextWriter writer) 
{  
    RenderContents(writer); 
} 


/// <summary> 
/// Renders the contents of the control to the specified writer. 
/// </summary> 
/// <param name="output">A <see cref="HtmlTextWriter"/> that represents 
/// the output stream to render HTML content on the client.</param> 
protected override void RenderContents(HtmlTextWriter output) 
{ 
    output.Write("<script type=\"text/javascript\"> " + Environment.NewLine); 
    output.Write("function clientId(id) {" + Environment.NewLine); 
    output.Write("switch (id) {" + Environment.NewLine); 
    output.Write(_builder.ToString()); 
    output.Write("  }" + Environment.NewLine); 
    output.Write("}" + Environment.NewLine); 
    output.Write("function getElementByClientId(id) {" + Environment.NewLine); 
    output.Write(" return document.getElementById(clientId(id));" + Environment.NewLine); 
    output.Write("}" + Environment.NewLine); 
    output.Write("</script>" + Environment.NewLine); 
} 
} 

Sonra harici JavaScript

<script type="text/javascript"> 
function clientId(id) { 
switch (id) { 
    case 'myControl': return 'ctl00_Main_myControl'; break; 
    } 
} 
function getElementByClientId(id) { 
    return document.getElementById(clientId(id)); 
} 
</script> 

Yani sayfasında aşağıdaki dışarı verecek Hangi aspx sayfası veya kod-arkasında

protected override void OnInit(EventArgs e) 
    { 
     ClientIdHandler clientIds = new ClientIdHandler(); 
     clientIds.AddControl(myControl); 

     this.Controls.Add(clientIds); 

     base.OnInit(e); 
    } 

kullanabilirsiniz okumak dosyasını aşağıdaki kullanabilirsiniz:

1

İhtiyacım olan tüm ClientID'leri almak için ScriptManager.RegisterStartupScript kullanıyorum.

  1. Kimlikleri saklamak için sayfanın 'başındaki' javascript değişkenlerini tanımlayın. aşağıdaki gibi Page_Load
  2. kullanımı RegisterStartupScript değişken değerini belirlemek için:

dize myscript = String.Format ("window.onload = fonksiyonu() {id1 = {0}, ID2 = {1}, id3 = {2}} ", Control1.ClientID, Control2.ClientID, Control3.ClientID);

ScriptManager.RegisterStartupScript (Sayfa, Page.GetType(), "SomeKey", myScript, true);