在ASP.Net页面上,我只在IE问题面前出现问题。这是描述。
在页面上,有两个按钮和一个标签。第一个按钮是可见的,并在click事件上调用JS函数。这个JS函数调用第二个按钮的click函数。第二个按钮在click事件上有一个C€事件处理程序。 C#事件处理程序编辑标签。
在Firefox中:点击后正确编辑标签。 在IE(8)中:尽管已正确命中C€事件处理程序,但未编辑标签。
另外,我在IE中观察到在点击JS按钮后调用了Page_Load事件两次: 的Page_Load button2_OnClick =>更改标签文本 Page_Load =>标签文本已重置:(
在Firefox中,Page_Load只被调用一次。
我的问题是:如何在点击JS按钮后使Firefox正确刷新页面?
以下是示例测试代码:
1)页面ASPX
<head runat="server">
<title></title>
<script type="text/javascript">
function button1Click(sender, args) {
var button2 = document.getElementById("button2");
button2.click();
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button runat="server" ID="button1" Text="Click-me!" OnClientClick="button1Click();" />
<asp:Button runat="server" ID="button2" Text="Second" OnClick="button2_OnClick" style="display:none" />
<p />
<asp:Label runat="server" ID="label1" Text="Init" />
</div>
</form>
</body>
</html>
2)C#代码隐藏:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void button2_OnClick(object sender, EventArgs e)
{
label1.Text = "Changed";
}
}
答案 0 :(得分:1)
渲染时,按钮的ID不会是button1或button2。它可能类似于ctl001_button1。因此,您的JavaScript将无法正常工作。在ASP.NET 4中,您可以使用指定的ClientID覆盖此行为。
<asp:Button runat="server" ID="button1" Text="Click-me!"
OnClientClick="button1Click();" ClientIDMode="Static" />
<asp:Button runat="server" ID="button2" Text="Second"
OnClick="button2_OnClick" style="display:none" ClientIDMode="Static" />
顺便说一句,这暗示了ASP.NET Winforms的主要问题 - 它让开发人员误以为Web是一个连接环境。
默认情况下单击<asp:Button />
元素时实际发生的情况是调用回发。即您的浏览器向服务器发送请求以获取新页面。它发送一个名为 ViewState 的东西,这是服务器知道你做了什么以及要渲染什么的。没有“事件”处理。
答案 1 :(得分:1)
我认为问题在于您尝试获取隐藏按钮的方式
var button2 = document.getElementById("button2");
可能会将此更改为
var button2 = document.getElementById("<%= button2.ClientID %>");
在浏览器中呈现按钮后,ASP将由ASP.Net引擎更改,而不是与您的源相同。
http://msdn.microsoft.com/en-us/library/system.web.ui.control.clientid.aspx
希望这有帮助。