2012-02-13 22 views
9

私の質問はうまくいけばかなり簡単です。 フォームを送信する際に、無効な文字(特にHTML)を持つすべてのプロパティ(フィールド)にモデルエラーとしてフラグを立てたいと思います。私が直面しています 問題がモデルバインディング/検証前でその要求の検証キックであり、私はHTTP 500 ... 私はあなたのモデル/ビューモデルに[AllowHtml] property属性を使用するかで<httpRuntime requestValidationMode="2.0" />のいずれかを使用してアドバタイズsimilar questionを見ます私が探しているのは、どのようにして "がグローバルにリクエスト検証例外をキャッチし、モデルエラーとして表示するかです。"です。さらに、HTMLタグを「ストリップ」したくないので、その入力が無効であることをユーザーに通知したい。モデルまたはプロパティの検証エラーとしてASP.NET MVC3要求検証例外を処理する方法

私は正規表現の検証が不正な入力を見つけるために、属性を使用して考えたが、私は述べたようにそれが何の-行くではありませんので、ASP.NET MVC3上の要求の検証は...、/検証を結合モデルの前に発生し

本当にgood overview of the Request Validation can be found hereです。

+0

あなたの問題を理解してください。コードビハインドでプロパティにフラグを立て、検証エラーが発生したときにコードビハインドでそれらのプロパティを操作したいですか? –

答えて

10

あなたの唯一の目的は、モデルのバインディング中にリクエストの検証例外を取得し、そのエラーをモデル状態エラーとして表示することです。ここではこれがモデル状態でのみ要求の検証の例外を追加します

using System.Web.Helpers; 
    public class MyModelBinder : DefaultModelBinder 
    { 
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      try 
      { 
       return base.BindModel(controllerContext, bindingContext); 
      } 
      catch(HttpRequestValidationException ex) 
      { 
       var modelState = new ModelState(); 
       modelState.Errors.Add(ex.Message); 
       var key=bindingContext.ModelName; 
       var value = controllerContext.RequestContext.HttpContext.Request.Unvalidated().Form[key]; 
       modelState.Value = new ValueProviderResult(value, value,CultureInfo.InvariantCulture); 
       bindingContext.ModelState.Add(key, modelState); 
      } 
      return null; 
     } 
    } 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     ModelBinders.Binders.DefaultBinder = new MyModelBinder(); 
    } 

サンプルは、です。申し訳ありませんが、私はあなたの質問を明確に理解していない場合。

+0

それは動作しますが、他のプロパティのようなフォームに値を保持しません... – zam6ak

+0

@ zam6ak、System.Web.Helpersを使用して追加し、私の更新された答えを参照してください。これは簡単な答えであり、あまり最適化されていないことに注意してください。そのために残念。 –

+0

これはすごくうまくいくように思えます - どうしてあなたはそれが「あまり最適化されていません」と言っているのか分かりません:) – zam6ak

関連する問題