表单无法正常工作的服务器端mvc3验证

时间:2012-02-10 12:02:22

标签: asp.net-mvc-3 validation

我的视图中有一个表单。表单上的字段来自模型。 我刚刚给出了一个变量来缩短代码。

MODEL:
public class abc
{
    [Required]
    public string name { get; set; }
}

VIEW:
<body onload="SetButton()">
@using (Html.BeginForm("myaction","mycontroller",FormMethod.POST, new {id="myform"}))
{
    @Html.TextBoxFor(m=>m.name)
    @Html.ValidationMessageFor(m=>m.name)
}
</body>
<script type="text/javascript">
function SetButton{
    document.getElementById("button").innerHTML='<input type="submit" value="Next"             style="width:90px" onclick="myform.submit()"/>';
}
</script>

Layout Page:
<div id="button"></div>

单击“下一步”按钮,不会进行验证。即使没有为'name'字段输入任何内容,表单也会被提交。如果按钮被放入Form(myform)中,验证将起作用。为什么验证不适用于所显示的代码?

1 个答案:

答案 0 :(得分:2)

您的提交按钮位于表单之外。这是不可能的。提交按钮必须放在相应的<form>元素内。因此,您需要在表单中移动<div id="button"></div>

如果由于某种原因div需要保持在表单之外(这在语义上是不正确的)你需要使用javascript,在这种情况下你可以使用普通按钮而不是提交按钮。

html表单的另一个重要方面是它们不能嵌套。因此,如果您的布局中有另一个表单,则视图中不能包含嵌套表单。这是无效的HTML并导致意外行为。

就服务器端验证而言,请确保您发布表单的控制器操作将视图模型作为操作参数:

[HttpPost]
public ActionResult MyAction(abc model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    ...
}