将多个前缀添加到DefaultModelBinder MVC2

时间:2010-07-18 06:22:48

标签: asp.net-mvc defaultmodelbinder model-binding

我查看了大多数ModelBinding示例,但似乎无法收集我正在寻找的内容。

我想:

<%= Html.TextBox("User.FirstName") %>
<%= Html.TextBox("User.LastName") %>

在帖子上绑定到此方法

public ActionResult Index(UserInputModel input) {}

其中UserInputModel是

public class UserInputModel {
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

约定是使用类名称为“InputModel”,但我不想每次都使用BindAttribute指定它,即:

public ActionResult Index([Bind(Prefix="User")]UserInputModel input) {}

我已经尝试重写DefaultModelBinder,但似乎无法找到适当的位置来注入这一小部分功能。

2 个答案:

答案 0 :(得分:2)

传递给ModelName函数的ModelBindingContext对象中的BindModel属性是您要设置的。这是一个模型绑定器,它执行此操作:

 public class PrefixedModelBinder : DefaultModelBinder
 {
     public string ModelPrefix
     {
         get;
         set;
     }

     public PrefixedModelBinder(string modelPrefix)
     {
         ModelPrefix = modelPrefix;
     }

     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
     {
         bindingContext.ModelName = ModelPrefix;
         return base.BindModel(controllerContext, bindingContext);
     }
 }

Application_Start中注册,如下所示:

ModelBinders.Binders.Add(typeof(MyType), new PrefixedModelBinder("Content"));

现在,您将不再需要为您指定的类型添加Bind属性,使用此模型绑定器!

答案 1 :(得分:1)

BindAttribute可以在类级别使用,以避免为UserInputModel参数的每个实例重复它。

====== EDIT ==

从表单中删除前缀或在视图模型上使用BindAttribute将是最简单的选择,但另一种方法是为UserInputModel类型注册自定义模型绑定器并显式查找所需的前缀。