我的视图中有一个表单。表单上的字段来自模型。 我刚刚给出了一个变量来缩短代码。
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)中,验证将起作用。为什么验证不适用于所显示的代码?
答案 0 :(得分:2)
您的提交按钮位于表单之外。这是不可能的。提交按钮必须放在相应的<form>
元素内。因此,您需要在表单中移动<div id="button"></div>
。
如果由于某种原因div需要保持在表单之外(这在语义上是不正确的)你需要使用javascript,在这种情况下你可以使用普通按钮而不是提交按钮。
html表单的另一个重要方面是它们不能嵌套。因此,如果您的布局中有另一个表单,则视图中不能包含嵌套表单。这是无效的HTML并导致意外行为。
就服务器端验证而言,请确保您发布表单的控制器操作将视图模型作为操作参数:
[HttpPost]
public ActionResult MyAction(abc model)
{
if (!ModelState.IsValid)
{
return View(model);
}
...
}