2011-07-16 11 views
1

私はこれのviewmodelはAllowHtml、HttpRequestValidationExceptionとにModelState

public class FooBarViewModel 
{ 
    public string Foo { get; set; } 

    [AllowHtml] 
    public string Bar { get; set; } 
} 

代わりの.FooはそれでHTMLで提出される場合HttpRequestValidationExceptionを投げを持って、私はModelStateにメッセージを追加したいです。どうすればいい?

答えて

1

Foo属性を[AllowHtml]属性で飾ることもできます。コントローラー内には、モデル状態にカスタムエラーを追加できるHTMLが含まれているかどうかをチェックします。

+0

これは現在おそらく動作します。私は、アクションフィルタなどで既存のビットを活用することを望んでいましたが、どこから開始するのかは不明です。 – kenwarner

+0

@ qntmfred実際にIExceptionFilterインターフェイスを実装し、そこにHttpRequestValidationExceptionをトラップするアクションフィルタを使用することができますが、問題はモデル状態にエラーを追加してビューをレンダリングするだけですがコントローラアクションは実行されません。これは、そのルートに進むことを決定した場合、このカスタムアクションフィルタ内に戻る可能性のあるViewResultにビューモデルを渡す必要があることを意味します。これは、あなたがまだAllowHtmlでFooプロパティを装飾し、次にチェックするカスタムアクションフィルタを持っていると言われています... –

+0

...投稿された値にHTMLが含まれているかどうか、そして単にモデル状態にエラーを追加するかどうか。そうすれば、複数のコントローラー・アクションでこのロジックを繰り返すのを避けることができます。 –

0

DefaultModelBinderの中に例外がスローされ、ValueProvider.GetValueが呼び出されます。

例外をキャッチしてModelStateエラーに変換する動作を変更するには、DefaultModelBinderを拡張または置き換える必要があります。

ValueProviderResult valueProviderResult = bindingContext.UnvalidatedValueProvider.GetValue(bindingContext.ModelName, skipValidation: !performRequestValidation); 

試みと例外をキャッチし、bindingContext.ModelState.AddModelErrorを呼び出す:

一つの可能​​性はBindModelを無効にし、それがGetValueを呼び出す時点ですることです。

問題はDefaultModelBinderがかなり複雑なので、モデルバインディングエコシステムの残りの部分とどのようにこのような変更が相互作用する必要があるかを慎重に考えなければならないことがあります。

関連する問題