全局使用BindAttribute

时间:2012-04-16 05:27:55

标签: asp.net-mvc asp.net-mvc-4

在ASP.NET MVC(4)应用程序中,我使用的是第三方Javascript库,它自动神奇地发回一个名字不好的查询字符串参数(IMO)。我可以使用以下内容拦截模型绑定中的此值:

public ActionResult MyAction([Bind(Prefix="rp")] int pageSize = 50) 
{
}

然而,在我使用分页的所有地方内的这段代码很快就会让人厌烦。

在ASP.NET MVC中是否可以使用特定的前缀/替换组合全局设置[BindAttribute]?

解决方法是修改Javascript库(不合需要的);或者手动从Request.QueryString属性中取出参数;但我希望保持清洁。

1 个答案:

答案 0 :(得分:2)

您可以使用视图模型:

public class MyViewModel
{
    public int PageSize { get; set; }
}
控制器操作中的

public ActionResult MyAction(MyViewModel model) 
{
    ...
}

然后为此视图模型编写自定义模型绑定器:

public class MyViewModelBinder: DefaultModelBinder
{
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
    {
        bindingContext.ModelName = "rp";
        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
    }
}

将在Application_Start注册:

ModelBinders.Binders.Add(typeof(MyViewModel), new MyViewModelBinder());