[英]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.Form
, Request.QueryString
)。
相反,您應該使用諸如Request.Unvalidated
, HttpContext.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.