自定义actionfilter发送formcollection问题

时间:2009-09-25 15:57:33

标签: c# asp.net-mvc

不确定这是否可能,或者我是否走错了路。

我想使用属性从我的表单发布数据中清除单引号 (这将被更改,但单引号是一个很好的例子)

我已经创建了actionFilter,如下所示:

public class RemoveSingleQuotesAttribute : ActionFilterAttribute
{
    public NameValueCollection collection { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        for (int i = 0; i < collection.Count; i++)
        {
            collection.Set(
                collection.GetKey(i),
                collection.GetValues(i).ToString().Replace("'","`")
                );
        }
    }
}

现在这就是我被困住的地方:

当我在括号中键入[RemoveSingleQuotes()]时,我只获得[Int Order]作为智能感知 而不是formcollection / Namevaluecollection

以及我如何传递收藏品?????

这甚至是可能的,还是我只是在这里创造了一些疯狂的东西?

感谢

2 个答案:

答案 0 :(得分:1)

您可以通过filterContext.RequestContext.HttpContext.Request.Form访问过滤器中的formvalues。无论如何,构建一个自定义模型绑定器可以更容易地删除不需要的字符。

这样你仍然可以使用绑定模型。您的解决方案将导致更改的Formcollection,但未更改的Model。您可以在更改后调用UpdateModel,但它仍然不是一个好的解决方案。

修改

public class CustomModelBinder :  DefaultModelBinder {
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) {
    if(propertyDescriptor.Name == "PropertyWithCharactersIneedToReplace") {
        MethodThatReplacesCharacters();
        return;
    }

    base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}

编辑1 我会这样应用ModelBinder:

public ActionResult UpdateSomeObject([ModelBinder(typeof(NiceModelBinder))]SomeViewModelType model)

答案 1 :(得分:0)

为什么不使用filterContext.HttpContext.Request.Form而不是将其传递给过滤器?据我所知,这是你需要的系列。