AllowHtml, HttpRequestValidationException and ModelState

本文关键字:ModelState and HttpRequestValidationException AllowHtml | 更新日期: 2023-09-27 18:02:23

我有这个viewmodel

public class FooBarViewModel
{
    public string Foo { get; set; }
    [AllowHtml]
    public string Bar { get; set; }
}

如果.Foo与html一起提交,我想向ModelState添加消息,而不是抛出HttpRequestValidationException。我怎么能这么做呢?

AllowHtml, HttpRequestValidationException and ModelState

您可以用[AllowHtml]属性来装饰Foo属性,以及在控制器内部检查它是否包含HTML,这将允许您添加自定义错误到模型状态

异常将在DefaultModelBinder调用ValueProvider.GetValue时抛出。

要更改行为以捕获异常并将其转换为ModelState错误,您需要扩展或替换DefaultModelBinder

一种可能是重写BindModel,并且在它调用GetValue的地方:

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

尝试捕获异常并调用bindingContext.ModelState.AddModelError

问题是DefaultModelBinder非常复杂,所以您可能需要仔细考虑这样的更改需要如何与模型绑定生态系统的其余部分交互。