【问题标题】:AllowHtml, HttpRequestValidationException and ModelStateAllowHtml、HttpRequestValidationException 和 ModelState
【发布时间】:2011-10-06 22:03:11
【问题描述】:

我有这个视图模型

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

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

如果.Foo 中包含html,我不想抛出HttpRequestValidationException,而是想向ModelState 添加一条消息。我怎么能这样做?

【问题讨论】:

    标签: c# asp.net-mvc-3 xss modelstate request-validation


    【解决方案1】:

    您也可以使用[AllowHtml] 属性装饰Foo 属性,并在控制器内部检查它是否包含允许您向模型状态添加自定义错误的HTML。

    【讨论】:

    • 现在可能会起作用。我希望通过动作过滤器或其他东西利用现有位,但不知道从哪里开始。
    • @qntmfred,您确实可以使用实现 IExceptionFilter 接口的操作过滤器并在那里捕获 HttpRequestValidationException 但问题是您所能做的就是将错误添加到模型状态并呈现视图但您的控制器操作将不会执行。这意味着,如果您决定采用该路线,您还必须注意将视图模型传递给 ViewResult,您可能会在此自定义操作过滤器中返回。话虽如此,您仍然可以使用 AllowHtml 装饰 Foo 属性,然后使用自定义操作过滤器检查 ...
    • ... 发布的值是否包含 HTML 以及是否只是向模型状态添加错误。如果必须,这当然可以避免您在多个控制器操作上重复此逻辑。
    【解决方案2】:

    异常将在DefaultModelBinder调用ValueProvider.GetValue的地方抛出。

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

    一种可能性是覆盖BindModel,并在它调用GetValue的地方:

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

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

    问题在于DefaultModelBinder 非常复杂,因此您可能需要仔细考虑此类更改需要如何与模型绑定生态系统的其他部分进行交互。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2014-10-27
      • 2015-10-27
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多