2013-06-25 37 views
0

我有一个jQuery选择一个有趣的情况中使用jQuery,试图找到一个asp.net LoginView内的东西:asp.net控制

说我有4所控制,2纯HTML <input> s和2 <asp:TextBox> ES。其中一个在<asp:Loginview>之内。

<asp:LoginView ID="LoginView1" runat="server"> 
    <LoggedInTemplate> 
     <input type="text" id="htmlInput1" /> 
     <asp:TextBox id="aspTextbox1" runat="server"></asp:TextBox> 
    </LoggedInTemplate> 
</asp:LoginView> 

<input type="text" id="htmlInput2" /> 
<asp:TextBox id="aspTextbox2" runat="server"></asp:TextBox> 

然后我们假设我想对它们中的每一个应用一些jquery。猜猜这四个中的哪一个不起作用?

<script> 
     $(function() {    
      $("#htmlInput1").datepicker(); 
      $("#htmlInput2").datepicker(); 
      $("#aspTextbox1").datepicker(); 
      $("#aspTextbox2").datepicker();    
     }); 
</script> 

由于某种原因,LoginView中的asp.net文本框未被触及。我必须以某种方式首先选择LoginView?

var x = $("LoginView1")..... 

回答

1

这是因为服务器端标记在呈现时被赋予唯一标识符。如果你打开页面的呈现源,你会发现元素的id已被修改为包含整个控件层次结构。正因为如此,你的jQuery选择器将不再找到该元素。

然而,因为他们总是会年底与指定的ID,您可以使用jQuery的attributeEndsWith选择:

$('[id$="aspTextbox1"]').datepicker(); 

或者,给所有你想为datepickerCssClass做到这一点的元素做:

$('.datepicker').datepicker(); 

这可能是一个更清洁,达到同样的事情不那么突兀的方式,因为它可以让你调用datepicker O法所有这些元素都只有一行代码。此外,它可以让你通过简单地赋予新的元素的同一个班级,而不必每次都修改您的jQuery添加日期选择器的元素:

<asp:TextBox id="aspTextbox999" CssClass="datepicker" runat="server" /> 
+0

这是快!谢谢! – graph

1

原因是ASP.NET汽车在运行生成ID时间与您尝试在jQuery中读取的内容不一样。打开viewsource并查看生成的ID。您可以使用该ID,否则,如果您使用ASP.NET 4.0或更高版本,我认为您可以设置ID可预测。阅读: http://weblogs.asp.net/asptest/archive/2009/01/06/asp-net-4-0-clientid-overview.aspx 对于ASP.NET控件

  $("#"+<%= Control.ClientID %>).val(); 
+0

'ClientIDMode'就是Devesh正在谈论的内容。 –