繁体   English   中英

MVC3中的AllowHTML和自定义IValueProvider

[英]AllowHTML and custom IValueProviders in MVC3

我有一个编写的自定义IValueProvider,用于处理json值。 它通过以下方式在globa.asax中注册

ValueProviderFactories.Factories.Insert(0, new JsonValueProviderFactory());

它工作正常,但是我最近需要发布一个包含HTML的模型。 默认情况下会生成旧的

A potentially dangerous Request.Form value was detected from the client

错误信息。 看起来解决该问题的方法通常是使用AllowHtml属性装饰model属性。 问题是我的价值提供者仍在抛出错误。 任何想法如何让我的价值提供者尊重AllowHtml属性?

以下是相关代码:

public class JsonValueProvider : IValueProvider, IValueDeserializer
{
    private ControllerContext context;

    public JsonValueProvider(ControllerContext controllerContext)
    {
        this.context = controllerContext;
    }

    public bool ContainsPrefix(string prefix)
    {
        return context.HttpContext.Request.Form.AllKeys.FirstOrDefault(i => i.StartsWith(prefix)) != null; //<!------- The error is thrown here
    }
    .....

如果需要处理“潜在危险”数据,则不能在自定义值提供程序中使用经过验证的请求数据(例如Request.FormRequest.QueryString )。

相反,您应该使用诸如Request.UnvalidatedHttpContext.Request.Unvalidated()HttpContext.Request.InputStream类的方法或属性。

如果您在自定义ValueProvider上实现IUnvalidatedValueProvider ,则它也可以与DefaultModelBinder / AllowHtml一起很好地工作。

IUnvalidatedValueProvider有一个重载的GetValue方法,用于告知提供程序是否跳过验证(这最终由AllowHtml设置)。

    public interface IUnvalidatedValueProvider : IValueProvider
    {
        ValueProviderResult GetValue(string key, bool skipValidation);
    }

在您的实现中,如果skipValidation为true,则应检索未验证的请求数据。 显然,在ContainsPrefix您无法访问经过验证的数据(例如Request.Form )。

话虽如此,从已经“未验证”的NameValueCollectionValueProvider继承可能是最容易的。 大多数内置的价值提供者都从中继承。 我已经链接到MVC源代码...看一下如何实现子类型。

Allow html仅适用于模型活页夹IIRC。 您可以使用Microsoft.Web.Infrastructure.DynamicValidationHelper ValidationUtility获取未经验证的表单和查询字符串,但请记住, 不仅使用AllowHtml的那些值都不会被验证的所有值!

Func<NameValueCollection> formGetter;
Func<NameValueCollection> queryStringGetter;

ValidationUtility.GetUnvalidatedCollections(HttpContext.Current, out formGetter, out queryStringGetter);

var form = formGetter();
var queryString = queryStringGetter();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM