2009-07-29 45 views
1

在动作方法绑定到参数之前,有没有办法编辑Request.Form?我已经有了一个反射调用来启用Request.Form的编辑。在绑定发生之前,我无法找到一个可以扩展的地方。在绑定前编辑Request.Form

更新:所以它看起来像我编辑Request.Form并没有意识到它。我正在通过查看绑定参数进行验证。这是不正确的b/c到达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()

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) 
{ 
    ... 
}