我在ASP.NET中开发一个用户控件(ascx),它使用javascript来操作控件。目前,javascript代码已内联,并使用<%= somecontrol.ClientID %>
来获取所需的控件。
我想将javascript文件放在外部文件中,但是从外部文件我不能使用上面的语法来检索控件。我已经阅读了this和this答案中可能的解决方案,但问题是用户控件可以在页面上多次放置。这意味着Controls数组(在答案中提到)将使用不同的项目多次呈现。因此,脚本将无法检索所需的ID。如果我将<%= ClientId %>
放在包含项目的数组的名称中,那么我将遇到与我试图解决的问题相同的问题。
有什么想法吗?
答案 0 :(得分:4)
好的,一种不同的方法,我尝试使用JavaScript类样式,然后为每个控件初始化它。
在外部javascript文件中,将代码编写为:
function oNameCls(ControlId1) {
this.ControlId1 = ControlId1;
this.DoYourWork1 = function() {
// use the control id.
// this.ControlId1
}
this.DoYourWork2 = function() {
// use the control id.
// this.ControlId1
}
}
在控制器上进行这样的调用。
<script language="Javascript" type="text/javascript">
// init - create
var <%=this.ClientID%>MyCls = new oNameCls(<%=Control1.ClientID%>);
// do your work
<%=this.ClientID%>MyCls.DoYourWork1();
</script>
希望现在有所帮助。
答案 1 :(得分:2)
我解决这个问题的方法是使用CSS类或将控件放在具有已知ID的容器中,然后遍历容器的子节点以获取实际控件。例如:
<asp:TextBox ID="Something" runat="server" CssClass="mycontrol" ... />
可以通过以下方式访问:
jQuery('.mycontrol');
或者:
<div id="ControlContainer">
<asp:TextBox ID="Something" runat="server" ... />
</div>
可以通过以下方式访问:
jQuery("#ControlContainer input[type='text']");
这种方法唯一真正的问题是你将代码绑定到页面上的特定标记,如果标记发生很大变化,这可能会很麻烦。
答案 2 :(得分:1)
隐藏变量怎么样:
<input type="hidden" id="ClientId" value="<%=ClientId %>">
然后从你的js:
$("#" + $("#ClientID").val())
或者,将哈希值放在:
<input type="hidden" id="ClientId" value="#<%=ClientId %>">
...
$($("#ClientID").val())
答案 3 :(得分:0)
如果要在可能有多个副本时找到特定控件,则无法执行此操作。外部JavaScript如何知道您想要哪个n
控件?
如何将行为归结为类并找到相对于动作控件位置的元素,如下所示:
用户控件:
<div class="myControl">
<asp:Button id="MyButton" runat="server" Text="Click Me" />
<div style="display:none;">Show me!</div>
</div>
如果你把jQuery写成这样的亲戚:
$(".myControl input").click(function() {
$(this).next().slideDown();
});
在这种情况下,只要您可以相对于您需要的控件导航DOM,具体ID是什么并不重要。即使它比.closest("div").next().find(".bob").prev()
更复杂......无论你需要什么,都可以。