【问题标题】:Form Submit Button Never Submits Form表单提交按钮从不提交表单
【发布时间】:2014-10-08 00:45:01
【问题描述】:

我正在使用 MVC 4 制作表单:

查看:

@model etc.Models.FormViewModel

@using (Html.BeginForm("NewForm", "Form", FormMethod.Post))
{
       // html helpers here ...

        <div class="row">
            <div class="form-group col-lg-2 col-lg-offset-5">
                <button type="submit" class="btn" value="Submit">Submit</button>
            </div>
        </div>
}

控制器:

    [HttpPost]
    public ActionResult NewForm()
    {

        FormViewModel newForm = new FormViewModel(); //this will never get hit
        return View();
    }

单击提交不会执行任何操作。它只是使页面向上滚动一点并专注于特定的输入字段。当我填充该字段和其他字段并再次单击提交时,无论我是否在控制器操作的顶部包含 [HttpPost],都不会调用 NewForm()。如何做到这一点,以便在单击提交按钮时调用 NewForm()?我如何实际将表单数据传递给 NewForm()?

【问题讨论】:

  • 验证您是在浏览器的调试网络监视器中或使用 Fiddler 等工具发出 POST 请求。
  • 我刚才试过了,但它没有触发任何 POST 请求。
  • 你有任何 javascript 拦截提交请求吗?如果您正在使用任何数据验证,请尝试关闭任何数据验证。
  • 您的模型是否有任何属性在提交表单时未满足?您可能会遇到客户端验证错误。
  • @MikeV 在底部添加Html.ValidationSummary 帮助我解决了这个问题。发布的表单带有未显示的验证错误,与格式错误的Html.DropdownListFor 有关。谢谢。

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


【解决方案1】:

问题原来是由于 MVC 4 server-side 客户端验证错误导致表单提交被阻止。如果不使用@Html.ValidationSummary,我当时很难看到这些错误。

【讨论】:

  • 如果使用 HttpPost 属性标记的 NewForm() 控制器方法从未触发,那么阻止表单提交的是客户端验证规则,而不是服务器端验证规则。服务器端验证规则将在 NewForm() 方法内部触发,并且可以使用 ModelState 进行检查。验证摘要在可用时显示客户端验证错误,如果您有发生服务器端验证并将错误添加到 ModelState 验证摘要也将显示这些错误。了解其中的区别很重要。