ModelState.AddModelError-プロパティ以外のエラーを追加するにはどうすればよいですか?


188

私はデータベースをチェックインしてCreate(FooViewModel fvm){...}fvm.prop1およびfvm.prop2がその組み合わせにすでに存在するかどうかを確認しています。もしそうなら、modelstateにエラーを追加して、ビュー全体を返します。私は試した:

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

...しかし、エラーが表示されません。エラーが表示さHtml.ValidationSummaryれると思います。「モデル」は正しいキーではないという疑いがありますが、Googleで何かを見つけることができませんでした。


回答:


328

最終的に私が探していた使用に遭遇しまし -通常のように、プロパティの1つではなく、一般にモデルにエラーを割り当てるために:

ModelState.AddModelError(string key, string errorMessage);

ただし、キーには空の文字列を使用します。

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

エラーメッセージは、<%: Html.ValidationSummary() %>予想どおりにに表示されます。


21
この場合、「ModelState.AddError(errorMessage)or ModelState.AddGlobalError(errorMessage)」のようなメソッドがないのはなぜかと思います。モデルのプロパティに関係のないエラーメッセージを追加する方法は直感的で簡単です。
Rubens Mariuzzo 2013

@Rubens:そうですが、そのようなメソッドを拡張メソッドで簡単に追加できます。
Johnny5 2013年

2
エラーを表示することもできます@Html.ValidationMessage(string.Empty)
Ben Foster

keyは、ビューにバインドされたモデルのプロパティであり、エラーが発生します。
niico 2016年

1
ValidationSummaryErrors(bool excludePropertyErrors)引数がtrueの場合、引数が偽または唯一の非プロパティ固有の(キー=「」)エラーがある場合は、過負荷は、すべての検証エラーが表示されます。
Suncat2000 2017年

26

モデルの任意のプロパティにモデルエラーを追加できます。新しいプロパティの作成に関連するものがない場合はお勧めします。

例として、電子メールがすでにDBで使用されているかどうかを確認し、エラーをアクションのEmailプロパティに追加します。これにより、ビューを返すときに、エラーがあることと、

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

そして

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

1
これは私の場合は直観に反するようです。データベースにcol1とcol2の特定の組み合わせが既に存在するかどうかを確認しているので、ViewModelにIsDuplicateOfAnotherRowプロパティがあるのは適切ではないようです。結局のところ、モデルにエラーを追加することができます-私の答えを見てください。
スコットベイカー

1
壊れやすいリテラル文字列を使用せずにAddModelErrorの文字列「Email」を取得する方法はありますか?好き(m=>m.email).SomeMagicToString()
Snekse、2014年

私はそうは思わない、あなたは魔法の文字列を使用して行かなければならない...最高それでも良い解決策
VinnyG

4
nameofC#6.0 のオペレーターは、この魔法の文字列の問題を解決します。msdn.microsoft.com/en-us/magazine/dn802602.aspx
RJ Cuthbertson

3

文字列にモデルのドットプロパティを置くことは私のために働きました: ModelState.AddModelError("Item1.Month", "This is not a valid date");


2
実際には、UIに無効な月が表示されますが、元の問題は解決されません。
スコットベイカー

2
元の問題は、メソッドで「キー」が何を表すかを理解していないことに起因します。これは、「キー」がどのように機能するかを明らかにするので、キーは単なるプロパティ名である必要はなく、ネストされたプロパティまたは特別な値String.Emptyを参照できることを知っておくとよいでしょう。
Triynko、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.