Asp.net mvc 2 ModelState.addmodeleror-如何添加非';不买房子?

Asp.net mvc 2 ModelState.addmodeleror-如何添加非';不买房子?,asp.net-mvc-2,asp.net-mvc-2-validation,modelstate,Asp.net Mvc 2,Asp.net Mvc 2 Validation,Modelstate,我正在Create(FooViewModel-fvm){…}中检查我的数据库,以查看fvm.prop1和fvm.prop2是否已经存在于该组合中;如果是这样,我想向modelstate添加一个错误,然后返回整个视图。我试过: 公共操作结果创建(FooViewModel fvm){ 如果(该组合已存在(fvm)){ AddModelError(“Model”,“已经有这样一个”); 返回视图(fvm); } } …但是我在Html.ValidationSummary中没有显示错误,我假设它们会出

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

公共操作结果创建(FooViewModel fvm){ 如果(该组合已存在(fvm)){ AddModelError(“Model”,“已经有这样一个”); 返回视图(fvm); } }
…但是我在
Html.ValidationSummary
中没有显示错误,我假设它们会出现在这里。我怀疑“Model”不是正确的键,但我在谷歌上找不到任何东西

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

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

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

我最终无意中发现了我正在寻找的用法——将错误分配给模型,而不是它的一个属性,通常您称之为:

ModelState.AddModelError(string key, string errorMessage);
但使用空字符串作为密钥:

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

如您所料,错误消息将出现在
中。

将model dot属性放入字符串对我来说很有效:
ModelState.AddModelError(“Item1.Month”,“这不是有效日期”)

在我的例子中,这似乎违反直觉-我正在检查数据库中是否已经存在col1和col2的特定组合,因此在我的ViewModel上使用IsDuplicateOtherRow属性似乎不正确。事实证明,您可以向模型中添加错误-请参阅我的答案。有没有一种方法可以在不使用脆弱文本字符串的情况下获取AddModelError的字符串“Email”?比如
(m=>m.email)。SomeMagicToString()
?我不这么认为,你必须使用magic string。。。不是最好的,但仍然是一个很好的解决方案C#6.0中的
nameof
操作符解决了这个神奇的字符串问题。这个案例让我思考:为什么没有像
ModelState.AddError(errorMessage)
ModelState.AddGlobalError(errorMessage)
这样的方法呢。。。找到如何添加与任何模型属性无关的错误消息将更直观、更容易。@Rubens:True,但您可以使用扩展方法轻松添加此类方法。您还可以使用
@Html.ValidationMessage(string.Empty)显示错误
键是绑定到视图的模型的属性-有错误-只是为了澄清一下。
ValidationSummaryErrors(bool excludePropertyErrors)
重载将显示所有验证错误,如果其参数为false或只有非属性特定的(key=“”)如果其参数为true,则会出现错误。这确实会在UI中显示一个无效的月份,但它无法解决原始问题。原始问题源于不理解“键”在方法中表示什么。这对“key”的功能有一定的了解,因此最好知道key不必只是一个属性名,还可以引用嵌套属性或特殊值String.Empty。
ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");