9

私の質問はうまくいけばかなり簡単です。フォームを送信する際に、無効な文字 (特に HTML) を含むすべてのプロパティ (フィールド) をモデル エラーとしてフラグ付けしたいと考えています。私が直面している問題は、モデルのバインド/検証の前にリクエストの検証が開始され、HTTP 500 が発生することです... Model/ViewModel でプロパティ属性を使用するか 、web.config で使用することを宣伝する同様の質問を見ましたが、探しているのは、「リクエスト検証の例外をグローバルにキャッチし、モデルエラーとして表示する」方法です。さらに、HTML タグを「削除」したくありません。入力が無効であることをユーザーに通知したいのです。[AllowHtml]<httpRuntime requestValidationMode="2.0" />

不正な入力を見つけるために正規表現の検証属性を使用することを考えましたが、前述したように、ASP.NET MVC3 での要求の検証は、モデルのバインド/検証の前に発生するため、それはうまくいきません...

Request Validation の非常に優れた概要については、こちらを参照してください。

4

1 に答える 1

10

あなたの唯一の意図は、モデルのバインド中に Request Validation 例外を取得し、エラーをモデル状態エラーとして表示することだと思います。これがサンプルです。

    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();
    }

これにより、モデル状態でのリクエスト検証のみの例外が追加されます。申し訳ありませんが、あなたの質問を明確に理解していない場合。

于 2012-02-13T17:14:02.633 に答える