ASP.NET(.NET Framework)中第二个<form>内的asp:Button不触发OnClick事件
问题描述
我的Default.aspx页面包含两个普通HTML表单,代码如下:
<div class="form"> <form id="WordFilterForm" > <label for="inputString">Enter a string:</label> <input type="text" id="inputString" name="inputString" required="required" /> <br /> <asp:Button ID="WordFilterButton" runat="server" Text="Filter" OnClick="WordFilterButton_Click" /> </form> </div> <div class="WordCountContainer"> <form id="WordCountForm"> <label for="inputText">Enter a large string:</label> <textarea id="inputText" name="inputText" rows="10" cols="50" required="required"></textarea> <br /> <asp:Button ID="WordCountButton" runat="server" Text="Count" OnClick="WordCountButton_Click" /> </form> <div>
WordFilterButton_Click与WordCountButton_Click均在Default.aspx.cs中以protected修饰定义。当前问题:点击第二个表单(id为WordCountForm)中的Count按钮时无任何反应,调试器显示WordCountButton_Click未执行;但将该按钮移至第一个表单中则可正常触发对应的OnClick函数。
原因分析
问题核心是ASP.NET Web Forms的回发机制限制:
- ASP.NET的服务器端控件(比如
<asp:Button>)要触发后台事件,必须位于带有runat="server"属性的<form>标签内部,且一个页面只能存在一个这样的服务器表单。 - 你当前的两个
<form>都是普通HTML表单(未添加runat="server"),第一个按钮能正常工作是因为ASP.NET会自动为页面生成一个隐式的<form runat="server">,并将第一个表单内的服务器控件包裹进去,以此支持回发触发后台事件。 - 第二个
<form>是独立的普通HTML表单,里面的<asp:Button>会被渲染成普通的submit按钮,点击后只会提交这个普通表单,不会触发ASP.NET的回发流程,因此后台的WordCountButton_Click方法不会被执行。 - 当把第二个按钮移到第一个表单里时,它被纳入了ASP.NET隐式服务器表单的范围内,自然就能正常触发回发和对应的后台事件。
内容的提问来源于stack exchange,提问作者joepaji
相关产品推荐
相关产品推荐

