为什么我的部分视图会在页面加载时验证?

时间:2011-12-24 06:10:30

标签: jquery asp.net asp.net-mvc asp.net-mvc-3 unobtrusive-validation

我正在使用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);
}

有人知道是什么原因引起的吗?如果没有,有什么方法可以调试这个验证以找出发生了什么?

1 个答案:

答案 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);
}

现在因为没有动作参数,默认模型绑定器不会尝试解析它,也不会添加模型错误。