jQuery form.submit事件处理程序阻止在模型中填充MVC按钮操作

时间:2013-11-03 12:22:08

标签: jquery asp.net-mvc asp.net-mvc-4

我正在处理的项目开始发生奇怪的事情。我已经找到了一个简单而方便的解决方法,但是我不喜欢触及大量现有代码的想法,因为它需要完整的回归测试。所以我已经构建了一个小应用程序来重现问题,但仍然可以这样做。以下是一些细节:

单个表单上有几个提交按钮,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();
    }
}

1 个答案:

答案 0 :(得分:1)

这是因为已禁用输入are not submitted,因此您不会发送单击按钮的值。

由于表单数据中没有“Action”参数,MVC正在使用与请求匹配的路由的action参数,在本例中为Index方法。 (如果重命名模型属性并将名称输入为MyAction而不是Action,那么您将看到值为null,因为响应中不包含任何值,并且属性名称与任何路径段都不匹配。)