我正在使用asp.net MVC3和客户端验证,以帮助验证我的表单。这很有效,但我遇到了一个不寻常的情况。我的表单的一部分(确切地说是2个输入)是从局部视图加载的。这些字段有自己的验证规则(例如“必需”)并按预期工作。好吧,差不多。奇怪的是,一旦局部视图在页面加载时被“请求”,规则似乎就会运行。所以我将有大约20个表格字段;其中2个(从局部视图)说明'此字段是必需的'。
这是我的父页面调用局部视图:
@Html.Action("Index", "Foo", @Model.Foo)
在我的局部视图模型中设置属性:
[Required(ErrorMessage = "This is required.")]
public string foo { get; set; }
在我的局部视图的视图中显示输入和验证:
@Html.LabelFor(m => m.test, "Test")
@Html.TextBoxFor(m => m.test)
@Html.ValidationMessageFor(m => m.test)
从其Controller调用部分视图:
public ActionResult Index(Foo myModel)
{
return PartialView("_PartialView", myModel);
}
有人知道是什么原因引起的吗?如果没有,有什么方法可以调试这个验证以找出发生了什么?
答案 0 :(得分:4)
发生这种情况的原因是,当默认模型绑定器尝试从请求值解析myModel
操作的Index
参数时,它会自动将错误添加到ModelState。我怀疑你传递的Model.Foo
无效。
如果您愿意,可以清除模型状态:
public ActionResult Index(Foo myModel)
{
ModelState.Clear();
return PartialView("_PartialView", myModel);
}
另一种可能性是传递有效的Foo
实例(即test
属性必须具有值)。事实上,如果你不想传递任何值,你真的不需要这个动作参数,你可以这样做:
public ActionResult Index()
{
var myModel = new Foo();
return PartialView("_PartialView", myModel);
}
现在因为没有动作参数,默认模型绑定器不会尝试解析它,也不会添加模型错误。