1

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

单个表单上有多个提交按钮,在 ActionMethod 中使用按钮值来区分用户操作。一切正常 - 我在模型操作字段中得到“创建”和“更新”。除非我在提交事件上放置一个 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>

模型 HomeData.cs:

public class HomeData
{
    public String Name { get; set; }
    public String Action { get; set; }
    public Int32 ID { get; set; }
}

控制器 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();
    }
}
4

1 回答 1

1

那是因为禁用的输入没有提交,所以你没有发送被点击的按钮的值。

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

于 2013-11-03T15:10:47.903 回答