点击表单按钮调用ASP.NET MVC控制器方法的问题排查与实现
问题排查与解决方案
先来说为什么DoSomethingAction没被触发——你踩了一个很容易忽略的HTML语法坑:表单嵌套。
看你的视图代码:
@using (Html.BeginForm()) { @* .... *@ <form action="DoSomethingAction" method="post"> <input type="text" id="IdString" name="IdString" placeholder="Enter id"/> <input id="Submit1" name="Submit1" type="submit" value="DoSomething1" /> <input id="Submit2" name="Submit2" type="submit" value="DoSomething2" /> </form> @* ..... *@ }
@using (Html.BeginForm())会自动生成一个外层<form>标签,而你在里面又手动写了一个<form>标签。HTML规范里绝对不允许表单嵌套,浏览器解析这种结构时会出现异常,导致内层表单的提交行为完全偏离预期,自然就不会触发目标Action了。
修复表单提交问题的步骤:
去掉外层的@using (Html.BeginForm()),或者改用Html.BeginForm直接生成指向DoSomethingAction的表单,比如:
@using (Html.BeginForm("DoSomethingAction", "MyController", FormMethod.Post)) { <input type="text" id="IdString" name="IdString" placeholder="Enter id"/> <input id="Submit1" name="Submit1" type="submit" value="DoSomething1" /> <input id="Submit2" name="Submit2" type="submit" value="DoSomething2" /> }
这样就能保证表单正确提交到MyController的DoSomethingAction方法了(你已经给Action加了[HttpPost]特性,这一步没问题)。
如何判断点击的是哪个按钮?
当点击提交按钮时,浏览器会把该按钮的name和value一起提交到服务器,有两种简单的判断方式:
- 通过Request.Form获取:
在Action里直接检查哪个按钮的name存在于表单数据中:
[HttpPost] public ActionResult DoSomethingAction() { string id = Request.Form["IdString"]; bool isSubmit1Clicked = !string.IsNullOrEmpty(Request.Form["Submit1"]); bool isSubmit2Clicked = !string.IsNullOrEmpty(Request.Form["Submit2"]); if (isSubmit1Clicked) { // 处理Submit1对应的逻辑 } else if (isSubmit2Clicked) { // 处理Submit2对应的逻辑 } // ... }
- 直接将按钮name作为Action参数:
ASP.NET MVC会自动把表单数据绑定到Action的参数上,所以可以直接声明对应参数:
[HttpPost] public ActionResult DoSomethingAction(string IdString, string Submit1, string Submit2) { if (Submit1 != null) { // 点击了DoSomething1按钮 } else if (Submit2 != null) { // 点击了DoSomething2按钮 } // ... }
这种方式更贴合MVC的参数绑定规范,代码也更简洁直观。
内容的提问来源于stack exchange,提问作者SomeoneNew
相关产品推荐
相关产品推荐

