1

有没有办法在操作方法绑定到参数之前编辑 Request.Form ?我已经有一个反射调用来启用 Request.Form 的编辑。我只是找不到可以在绑定发生之前更改它的可扩展点。

更新:所以看起来我正在编辑 Request.Form 并没有意识到这一点。我通过查看绑定参数进行验证。当您到达 ActionFilter 时,这是不正确的 b/c,表单值已经被复制/设置到/在 ValueProvider 中。我相信这是为了绑定而拉取值的地方。

所以问题变成了在绑定表单值之前对表单值应用一些过滤的最佳方法是什么。我仍然希望绑定发生。我只想编辑它用来绑定的值。

4

2 回答 2

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)
{
    ...
}
于 2009-07-29T20:13:12.907 回答
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);
    }
}
于 2009-08-02T11:44:43.823 回答