如何将ASP.NET MVC3请求验证异常作为模型或属性验证错误处理

zam*_*6ak 9 request-validation model-validation asp.net-mvc-3

我的问题很有希望.提交表单后,我想将包含无效字符(特别是HTML)的所有属性(字段)标记为模型错误.我面临的问题是请求验证在模型绑定/验证之前启动并且我获得了HTTP 500 ...我看到了一个类似的问题,它[AllowHtml]在Model/ViewModel上使用属性属性或<httpRuntime requestValidationMode="2.0" />在web.config中使用属性属性 ,但是我在我正在寻找的是如何" 全局捕获请求验证异常并将其显示为模型错误 ".此外,我不想"剥离"HTML标签,我想通知用户他们的输入无效.

我想过使用正则表达式验证属性来查找错误的输入,但正如我所提到的,ASP.NET MVC3上的请求验证发生在模型绑定/验证之前,所以这是不行的...

可以在此处找到关于请求验证的非常好的概述.

小智 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();
    }
Run Code Online (Sandbox Code Playgroud)

这将在模型状态中添加请求验证的例外.对不起,如果我不明白你的问题.