2012-08-17 6 views
5

コントローラのモデルオブジェクトのキーを取得して、AddModelErrorを追加できるようにしようとしています。同等のコードは、それがこのValidationMessageに接続するように、コントローラに追加するKey名を取得するためにいただきました、私はコントローラで強く型付けされたモデルの "キー"を取得

@Html.ValidationMessageFor(model => model.Email) 

を使用する私の見解では

答えて

2
ModelState.AddModelError("Email", "the email is invalid"); 

通常はコントローラで手動で行う必要はありませんが、バリデータを使用する必要があります。たとえば、このEmailプロパティをいくつかの検証データアノテーション属性で飾ることができます。もし私のようなものであれば、FluentValidation.NET =>このようにして、実際の検証ロジックに重点を置いてキーに関する質問をするべきではありません。

+0

キーは常に名前になりますか?私はこれが生成されたと思ったので、常にオブジェクト名であるとは限りませんでしたか? –

+0

いつも同じです。 –

+0

フィールド名と常に同じです。 ReSharperを使用してもフィールドの名前を変更すると、一致するものだけが一致するため、この文字列は更新されないため、慎重にしてください。幸いにも、私は、未知のキーを使用すると、あなたのページが例外をスローするような悪影響はないと考えています。これは 'null'を使うことと同じです。 –

17

あなたはHtmlHelpersと同じ処理を行い拡張子を使用することができ、それは、ネストされた性質のために動作します:

に相当

ModelState.AddModelError<TModel>(i => i.Person.Name, "test"); 

public static class ModelStateExtensions 
{ 
    public static void AddModelError<TModel>(this ModelStateDictionary dictionary, Expression<Func<TModel, object>> expression, string errorMessage) 
    { 
    dictionary.AddModelError(ExpressionHelper.GetExpressionText(expression), errorMessage); 
    } 
} 

だから、このようにそれを使用することができます

ModelState.AddModelError("Person.Name", "test"); 

これは、Htmlと同じIDを生成します。 MVCソースでは、いくつかの余分なサニタイズを行いますが、通常の名前では問題ではありません。

+2

これを使用してエラーが発生しました。式が構造体の場合、式はオブジェクトを返すため、Convert(property)のように見えます。その場合、式テキストは空の文字列に評価されます。関数をpublic static void AddModelError (このModelStateDictionary辞書、Expression >式、string errorMessage)に変更し、ModelState.AddModelError((TModel i)=> iのように呼び出すことをお勧めします。 Person.Name、 "test") – Sven

関連する問題