ModelState.AddModelError - 如何添加不属于属性的错误?

Sco*_*ker 180 modelstate asp.net-mvc-2-validation asp.net-mvc-2

我在检查我的数据库Create(FooViewModel fvm){...},看是否fvm.prop1fvm.prop2在该组合已经存在; 如果是这样,我想向modelstate添加一个错误,然后返回整个视图.我试过了:

public ActionResult Create(FooViewModel fvm){
    if (ThatComboAlreadyExists(fvm)) {
      ModelState.AddModelError("Model", "There is already one like that");
      return View(fvm);
    }
}
Run Code Online (Sandbox Code Playgroud)

...但我没有显示错误Html.ValidationSummary,这是我认为它们会出现的地方.我怀疑"模型"不是正确的关键,但我一直无法找到任何谷歌.

Sco*_*ker 312

我最终偶然发现了一个我正在寻找的用法的例子 - 通常给模型分配一个错误,而不是像其中一个属性一样,你通常会调用:

ModelState.AddModelError(string key, string errorMessage);
Run Code Online (Sandbox Code Playgroud)

但是为密钥使用空字符串:

ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");
Run Code Online (Sandbox Code Playgroud)

错误消息将以<%: Html.ValidationSummary() %>您期望的方式显示在其中.

  • 这个案例让我想到:为什么没有类似`ModelState.AddError(errorMessage)`或`ModelState.AddGlobalError(errorMessage)`的方法......它会直观,更容易找到如何添加错误消息无关任何模型的属性. (20认同)
  • @Rubens:确实如此,但是您可以使用扩展方法轻松添加这样的方法。 (3认同)
  • `ValidationSummaryErrors(bool excludePropertyErrors)` 重载将在其参数为假时显示所有验证错误,或者如果其参数为真,则仅显示非属性特定 (key = "") 错误。 (3认同)
  • 您还可以使用`@ Html.ValidationMessage(string.Empty)`显示错误 (2认同)

Vin*_*nyG 26

您可以在模型的任何属性上添加模型错误,我建议是否与创建新属性无关.

作为示例,我们检查电子邮件是否已在DB中使用,并将错误添加到操作中的Email属性,因此当我返回视图时,他们知道存在错误以及如何通过使用显示它

<%: Html.ValidationSummary(true)%>
<%: Html.ValidationMessageFor(model => model.Email) %>
Run Code Online (Sandbox Code Playgroud)

ModelState.AddModelError("Email", Resources.EmailInUse);
Run Code Online (Sandbox Code Playgroud)

  • C#6.0中的`nameof`运算符解决了这个神奇的字符串问题.http://msdn.microsoft.com/en-us/magazine/dn802602.aspx (4认同)