4

まず第一に、データ注釈ベースのモデル検証が ASP.NET MVC4 でどのように機能するかを理解し、それを .NET で正常に実装したと言わざるを得ませんDataAnnotationsModelValidatorProvider。そのため、セットアップの支援は必要ありません。

しかし、 になるHtmlHelpersと、エラー メッセージのコンテキストを把握するのに苦労しています。と言うcontextのは、どのエラーについて話しているかを意味します。エラーを返した属性はどれですか?

私が得ることができるのはKey、エラーと現在ErrorMessageのものですが、プログラム的には、私が話しているエラーを伝えるものは何もありません。それがRequired属性であろうと他の属性であろうと、それらを区別する方法を見つける方法はありません。

シナリオを少し開いてみましょう。要素HtmlHelpersをレンダリングするカスタムがあります。ContentEditableたとえばHtml.ContentEditableValidationMessageFor(m => m.firstName);。次のような出力が得られます。

<span contenteditable="true" data-valmsg-for="firstName" data-valmsg-replace="Please provide first name" class="field-validation-error">Please provide first name</span>

現在、contenteditable要素の変更を処理して永続化するための jQuery プラグインがあり、それらをバックエンドに永続化します。ただし、UI には、どのエラー メッセージについて話しているかを示すものは何もありません。人間はそれが であることを簡単に確認できますが、プログラム的には、たとえばRequiredAttributeいくつかのものと区別するためのデータがありません。MinLengthAttribute

このシナリオでは、単純に をdata-valmsg-for="firstName"ローカライズのキーとして使用すると、同じプロパティに関するすべてのエラーに対して同じエラー メッセージが返されます。

丸めるには

ModelStateModelError の一意の ID を発行するためのベスト プラクティスはありますか? ASP.NET MVC4 とDataAnnotationsModelValidatorProvider.

ModelState「一緒にハックする」方法はたくさん考えられますが、MVC が提供するものは何でも使用したいと思います。すべてが custom を書くことに帰着するならModelValidatorProvider、私はそれに対してすべてオープンです。それが最良かつ最も持続可能な方法である限り。私はすべて、今すぐハッキングし、機能し続けるために永遠にハッキングするよりも、今より多くのことを行い、後で行うことを支持します

4

2 に答える 2

2

実装しても役に立ちません。モデル メタデータに基づいてModelValidatorProviderを提供するための単なるメカニズムです。ModelValidatorモデル バインディング プロセス中にコントローラー アクションModelValidatorが呼び出されると、結果はと textModelValidationResultのみを含むものになります。MemberNameMessage

次のようなエラー メッセージを確認して、どの ModelValidator が失敗したかを確認する汚い方法があると思います。

var modelErrors = ModelState.Where(m => m.Value.Errors.Count > 0).Select(m => new { Name=m.Key , Errors=m.Value.Errors});

modelErrors の各キーの Errors の ErrorMessage を ValidatorProvider エラー メッセージと照合することで、エラーがどの Validator に属しているかを確認できます。

于 2013-04-08T13:47:53.490 に答える