2011-11-17 4 views
7

MVCコントローラを使用してREST APIを開発しています。すべてのモデルバインディングエラーを処理して、ユーザーフレンドリーな方法でクライアントに報告したいと思います。私のカスタムモデルのバインダーでは、私はすでに例外ハンドラーによって安全と考えられ、クライアントに示されている特別な例外を投げています。ASP.NET MVCモデルのバインディングエラーを確実に処理します

デフォルトのモデルバインダーは、無効な値(intのためと言う、asdf)を見たときしかし、完全に(パラメータが不要の場合)、それを無視するか(パラメータが必要な場合)、プレーンArgumentExceptionをスローするかと思われます。手作業でバインダー全体を書き直すことなく、両方のケースを確実に処理してパラメーターの名前と関連するエラーを取得することは可能ですか?

クライアントが気にするべきでないメソッドと名前空間の名前を明らかにするため、私はむしろArgumentExceptionをそのまま表示したいと思います。私はむしろ、それが回避可能な場合はArgumentExceptionメッセージを解析しないで、不要なパラメータが完全に無視される無効な値では問題を解決できません。

+0

あなたは良い解決策を見つけたことがありますか?私は 'IModelBinder'を装飾またはサブクラス化することを考えていますが、もっと良い方法があるかどうかを知りたいと思います。 –

+0

@FabianSchmied:残念ながら、 "Web API"モデルのバインダーはおそらくこのケースをサポートしています。ASP.NET Coreについてはわかりません。 –

答えて

3

モデルにIValidatableObjectインターフェイスを実装できます。ここでは、現在持っているRequired属性の検証を置き換える独自の検証ロジックを作成できます。

public class Model : IValidatableObject { 
    public int MyIntProperty { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { 
     if (MyIntProperty == 0) { 
      yield return new ValidationResult("Please provide a valid value for MyIntProperty.", new[] { "MyIntProperty" }); 
     } 
    } 
} 

コントローラでは、ModelState.Errorsコレクションを検証して検証エラーを確認できます。また、厳密に型指定されたビューとHTMLフォームヘルパーを使用している場合は、クライアント側でエラーCSSクラスが生成されます。

関連する問題