【问题标题】:ModelState.AddModelError - How can I add an error that isn't for a property?ModelState.AddModelError - 如何添加不属于属性的错误?
【发布时间】:2011-04-21 04:00:30
【问题描述】:

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

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

...但我在Html.ValidationSummary 中没有显示任何错误,我认为这是它们会出现的地方。我怀疑“模型”不是正确的键,但我无法在谷歌中找到任何东西。

【问题讨论】:

标签: asp.net-mvc-2 asp.net-mvc-2-validation modelstate


【解决方案1】:

我最终偶然发现了an example 我正在寻找的用法 - 通常将错误分配给模型,而不是像往常一样为它的属性之一分配错误:

ModelState.AddModelError(string key, string errorMessage);

但使用空字符串作为键:

ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");

如您所料,错误消息将出现在<%: Html.ValidationSummary() %> 中。

【讨论】:

  • 这个案例让我想:为什么没有像ModelState.AddError(errorMessage)ModelState.AddGlobalError(errorMessage) 这样的方法......它会更直观更容易找到如何添加与任何无关的错误消息模型的属性。
  • @Rubens :是的,但您可以轻松地使用扩展方法添加这样的方法。
  • 也可以使用@Html.ValidationMessage(string.Empty)显示错误
  • 键是绑定到视图的模型的属性 - 有错误 - 只是为了清楚。
  • ValidationSummaryErrors(bool excludePropertyErrors) 重载将在其参数为 false 时显示所有验证错误,或者在其参数为 true 时仅显示非属性特定 (key = "") 错误。
【解决方案2】:

您可以在模型的任何属性上添加模型错误,如果没有与创建新属性相关的内容,我建议。

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

<%: Html.ValidationSummary(true)%>
<%: Html.ValidationMessageFor(model => model.Email) %>

ModelState.AddModelError("Email", Resources.EmailInUse);

【讨论】:

  • 在我的情况下这似乎违反直觉 - 我正在检查数据库中是否已经存在 col1 和 col2 的特定组合,因此在我的 ViewModel 上使用 IsDuplicateOfAnotherRow 属性似乎不正确.事实证明,您可以在模型中添加错误 - 请参阅我的答案。
  • 有没有办法在不使用脆弱的文字字符串的情况下为 AddModelError 获取字符串“Email”?喜欢(m=&gt;m.email).SomeMagicToString()
  • 我不这么认为,你必须使用魔法字符串......不是最好的,但仍然是一个很好的解决方案
  • C# 6.0 中的nameof 运算符解决了这个神奇的字符串问题。 msdn.microsoft.com/en-us/magazine/dn802602.aspx
【解决方案3】:

将模型点属性放在字符串中对我有用:ModelState.AddModelError("Item1.Month", "This is not a valid date");

【讨论】:

  • 这确实会在您的 UI 中显示无效的月份,但它并不能解决最初的问题。
  • 原来的问题源于不理解方法中的“key”代表什么。这阐明了“key”的功能,因此很高兴知道 key 不必只是属性名称,还可以引用嵌套属性或特殊值 String.Empty。
【解决方案4】:

尝试使用以下答案以获得一致的输出格式:- new ValidationProblemDetails()

if (!ModelState.IsValid) { 
ModelState.AddModelError("ErrorKey", "ErrorValue");
return BadRequest(new ValidationProblemDetails(this.ModelState));
}

输出格式:

{
    "errors": {
        "ErrorKey": [
            "ErrorValue"
        ]
    },
    "title": "One or more validation errors occurred.",
    "status": 400,
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多