我正在处理的项目开始发生奇怪的事情。我已经找到了一个简单而方便的解决方法,但是我不喜欢触及大量现有代码的想法,因为它需要完整的回归测试。所以我已经构建了一个小应用程序来重现问题,但仍然可以这样做。以下是一些细节:
单个表单上有几个提交按钮,ActionMethod中使用按钮值来区分用户操作。一切运作良好 - 我在模型Action字段中获得'Create'和'Update'。除非我在提交事件上放置一个jQuery处理程序 - 这次我开始一直得到'索引'。实际上处理程序本身仍然没问题,但是禁用提交按钮的单行执行了魔术。
有人能够解释这里发生了什么吗?提前谢谢。
页面(Index.cshtml):
@model MvcButtonTest.Models.HomeData
<html>
<head>
<title>Index</title>
@System.Web.Optimization.Scripts.Render("~/bundles/jquery")
<script>
$(document).ready(function () {
$("form").submit(function (ev) {
// $(":submit", this).attr("disabled", "disabled");
});
});
</script>
</head>
<body>
@using (Html.BeginForm())
{
@Html.EditorFor(model => model.Name)<br />
@Html.EditorFor(model => model.ID)
<input name="Action" type="submit" value="Create" />
<input name="Action" type="submit" value="Update" />
<input name="Action" type="submit" value="Delete" />
}
</body>
</html>
Model HomeData.cs:
public class HomeData
{
public String Name { get; set; }
public String Action { get; set; }
public Int32 ID { get; set; }
}
Controller HomeController.cs:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(HomeData data)
{
// data.Action - check if it's Create or Delete
return View();
}
}
答案 0 :(得分:1)
这是因为已禁用输入are not submitted,因此您不会发送单击按钮的值。
由于表单数据中没有“Action”参数,MVC正在使用与请求匹配的路由的action参数,在本例中为Index方法。 (如果重命名模型属性并将名称输入为MyAction而不是Action,那么您将看到值为null,因为响应中不包含任何值,并且属性名称与任何路径段都不匹配。)