ModelState.AddModelError-如何添加非属性错误?


188

我正在检查数据库,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,我认为这是错误的出现位置。我怀疑“模型”不是正确的键,但是我找不到Google那样的东西。


Answers:


328

最终,我偶然发现了一个我正在寻找的用法示例 -通常向模型分配错误,而不是像往常一样调用它的属性之一:

ModelState.AddModelError(string key, string errorMessage);

但使用空字符串作为键:

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

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


21
这种情况使我想到:为什么不存在类似ModelState.AddError(errorMessage)ModelState.AddGlobalError(errorMessage)... 的方法,这将是直观且容易找到如何添加与任何模型的属性无关的错误消息的方法。
Rubens Mariuzzo

@Rubens:是的,但是您可以轻松地将这种方法与扩展方法一起添加。
约翰尼

2
您还可以使用@Html.ValidationMessage(string.Empty)
Ben Foster

关键是要绑定到视图的模型的属性-带有错误-只是为了清楚。
niico

1
ValidationSummaryErrors(bool excludePropertyErrors),如果它的参数是假的或唯一的非财产特定如果它的说法是真实的过载将显示所有验证错误(键=“”)的错误。
Suncat2000

26

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

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

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

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

1
就我而言,这似乎违反直觉-我正在检查数据库中是否已存在col1和col2的特定组合,因此在ViewModel上具有IsDuplicateOfAnotherRow属性似乎不正确。事实证明,您可以在模型中添加错误-请参阅我的答案。
Scott Baker

1
有没有办法在不使用脆弱的文字字符串的情况下获取AddModelError的字符串“ Email”?喜欢(m=>m.email).SomeMagicToString()吗?
Snekse

我不这么认为,您必须使用魔术弦...不是最好的,但仍然是一个很好的解决方案
VinnyG 2014年

4
nameofC#6.0中的运算符解决了这个魔术字符串问题。msdn.microsoft.com/zh-CN/magazine/dn802602.aspx
RJ Cuthbertson,

3

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


2
那确实会在您的用户界面中显示一个无效的月,但它不能解决原始问题。
Scott Baker 2015年

2
最初的问题源于不了解方法中“键”代表什么。这为“键”的功能提供了一些启示,因此很高兴知道键并不仅是一个属性名称,还可以引用嵌套属性或特殊值String.Empty。
Triynko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.