2009-07-29 6 views
1

アクションメソッドがパラメータにバインドする前にRequest.Formを編集する方法はありますか?私はすでに、Request.Formの編集を可能にするためのリフレクションコールを持っています。私はバインディングが発生する前に私がそれを変更することができるどこに拡張性のポイントを見つけることができません。バインドする前にRequest.Formを編集する

更新:私はRequest.Formを編集していて、それを認識していないようです。私はバインドされたパラメータを調べて確認していました。 ActionFilterに到達するまでにフォームの値が既にValueProviderにコピー/セットされているまでには間違っています。私が信じているのは、値がバインドされている場所です。

したがって、フォームの値がバインドされる前に、いくつかのフィルタリングを適用するための最良の方法が問題になります。私は依然として拘束力を発揮したい。バインドするのに使う値を編集したいだけです。

答えて

0

を私はDefaultModelBinderにSetPropertyメソッドを拡張することになりました基本動作を続行する前に値をチェックしてください。値が文字列の場合、フィルタリングを実行します。

public class ScrubbingBinder : DefaultModelBinder 
{ 
    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value) 
    { 
     if (value.GetType() == typeof(string)) 
      value = HtmlScrubber.ScrubHtml(value as string, HtmlScrubber.SimpleFormatTags); 
     base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value); 
    } 
} 
0

カスタムフィルタを作成し、OnActionExecuting()を上書き:

public class CustomActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    } 
} 

それとも単にあなたのコントローラでOnActionExecuting()

UPDATED上書き:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var actionName = filterContext.ActionDescriptor.ActionName; 

    if(String.Compare(actionName, "Some", true) == 0 && Request.HttpMethod == "POST") 
    { 
     var form = filterContext.ActionParameters["form"] as FormCollection; 

     form.Add("New", "NewValue"); 
    } 
} 

public ActionResult SomeAction(FormCollection form) 
{ 
    ... 
} 
関連する問題