簡體   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