2011-06-20 33 views
7

在我的自定義模型綁定我用未經驗證的IValueProvider.GetValue

bindingContext.ValueProvider.GetValue(propertyName); 

我有[ValidateInput(假)]的動作。然而從客戶端中檢測到

有潛在危險的Request.QueryString值的GetValue調用上述結果

如何讓我的自定義模型粘合劑得到價值提供商未經驗證的價值?當然,當它發現有關於動作的ValidateInput(false)時。

回答

1

以防萬一有人好奇,這裏有一個快速解決方案。只需在BindModel/BindProperty方法中調用CheckUnvalidated()即可。這將用未經驗證的版本替換默認的QueryStringValueProvider。

MethodInfo GetActionMethod(ControllerContext controllerContext) 
    { 
    var action = controllerContext.RouteData.Values["action"] as string; 
    return controllerContext.Controller.GetType().GetMethods().FirstOrDefault(x => x.Name == action || 
     x.GetCustomAttribute<ActionNameAttribute>().SafeGet(a => a.Name) == action); 
    } 

    void CheckUnvalidated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
    var method = GetActionMethod(controllerContext); 
    if (method == null) 
     return; 
    if (method.GetCustomAttribute<ValidateInputAttribute>().SafeGet(x => x.EnableValidation, true)) 
     return; 
    var collection = bindingContext.ValueProvider as ValueProviderCollection; 
    if (collection == null) 
     return; 
    var old = collection.OfType<QueryStringValueProvider>().FirstOrDefault(); 
    if (old != null) 
     collection.Remove(old); 
    collection.Add(new UnvalidatedQueryStringValueProvider(controllerContext)); 
    } 

    class UnvalidatedQueryStringValueProvider : NameValueCollectionValueProvider 
    { 
    public UnvalidatedQueryStringValueProvider(ControllerContext controllerContext) 
     : base(controllerContext.HttpContext.Request.Unvalidated().QueryString, CultureInfo.InvariantCulture) 
    { 
     } 
    } 
相關問題