【问题标题】:Why does my partial view validate on page load?为什么我的部分视图在页面加载时验证?
【发布时间】:2011-12-24 06:10:29
【问题描述】:

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

从其控制器调用局部视图:

public ActionResult Index(Foo myModel)
{
    return PartialView("_PartialView", myModel);
}

有人知道是什么原因造成的吗?如果没有,有什么方法可以调试此验证以了解发生了什么?

【问题讨论】:

  • 感谢@ashkan-mobayen-khiabani 的提示,我已经用我认为相关的代码更新了我的帖子。

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


【解决方案1】:

发生这种情况的原因是,当默认模型绑定器尝试从请求值解析 Index 操作的 myModel 参数时,它会自动将错误添加到 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);
}

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

【讨论】:

  • 非常感谢@darin-dimitrov,你让我摆脱了数小时的挫败感。我必须传入一个现有模型,所以第一个解决方案对我来说非常有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2021-11-15
  • 1970-01-01
相关资源
最近更新 更多