将ASPX页面转换为控制器(ASCX)时遇到问题。我的JavaScript在隐藏的div中找不到文本框,也没有触发onclick事件。但是它在ASPX页面中运行得非常好。
我的JavaScript是..
function FireEditClickButton() {
document.getElementById("btnFireEdit").click();
}
它应该触发这个隐藏div中的按钮以及下一个部分)
<asp:Button ID="btnFireEdit" runat="server" OnClick="btnFireEdit_Click" />
然后使用此JavaScript
function GetSelection() {
var c = document.getElementById("tbRA");
c.innerText = checkListBox.GetSelectedValues();
UpdateText();
}
每次checklistbox都有值时,会被调用。
这两个错误都说它们是空的,但它们就在隐藏的div中
<div style="visibility: hidden">
<asp:TextBox ID="tbRA" runat="server"></asp:TextBox>
<asp:Button ID="btnFireEdit" runat="server" OnClick="btnFireEdit_Click" />
</div>
那么为什么会发生这种情况,因为它在ASPX页面中完全正常?是否与WebUserControl有关,而不是使用表单标签?
由于
答案 0 :(得分:1)
使用嵌套控件(或嵌套在母版页中的页面)时,默认情况下,客户端上的ID与服务器上的ID不同。 ASP.NET默认执行此操作以帮助确保客户端上的所有ID都是唯一的。但是,您可以使用以下两种方法之一来防止这种情况。
第一个选项是将ClientIDMode更改为静态。您可以在control,page,web.config或machine.config级别执行此操作。 web.config技术如下所示。然后,客户端上的ID将与服务器上的ID匹配。
<configuration>
<system.web>
<pages clientIDMode="static" />
</system.Web>
</configuration>
第二个选项是使用内联C#代码将ID嵌入到JavaScript中,但这仅在JavaScript嵌入ASP.NET页面或控件而不是单独的脚本文件中时才有效。将评估C#表达式,因此客户端上的ID将嵌入到JavaScript中。
document.getElementById('<%= btnFireEdit.ClientId %>');
还有第三种选择,那就是弄清楚客户端上的ID是什么,然后手动将它放在JavaScript中,如下所示:
document.getElementById("myctrlname_btnFireEdit").click();
然而,这是一个糟糕的想法。如果您重命名myctrlname
或btnFireEdit
,那么您的客户端代码将在运行时失败。在编译时失败比运行时更好。
答案 1 :(得分:1)
您的javascript无法找到该按钮,因为在呈现的HTML中,它不再具有id="btnFireEdit"
,而是基于usercontrol名称的ID(例如id="myctrlname_btnFireEdit"
)。
您有两个选择...要么更新javascript以包含usercontrol的名称......
document.getElementById("myctrlname_btnFireEdit").click();
document.getElementById("<%=btnFireEdit.ClientID%>").click();
(注意,这两行中的第二行只有在javascript是usercontrol本身的一部分时才有效。如果javascript在外部.js
文件或父页面中,它将不起作用
或使用ClientIDMode
的{{1}}属性并将值设置为<asp:Button>
。这将使呈现的HTML使用Static
...
id="btnFireEdit"