2010-07-18 115 views
1

我已经查看了大部分ModelBinding示例,但似乎无法收集我在寻找的内容。将多个前缀添加到DefaultModelBinder MVC2

我想:

<%= 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;} 
} 

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

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

我试过重写DefaultModelBinder,但似乎无法找到适当的位置来注入这个微小的功能。

回答

1

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

======编辑======

只是删除您的形式前缀或使用视图模型的BindAttribute将是最简单的选择,而是一种替代方案是注册一个UserInputModel类型的自定义模型联编程序并显式查找所需的前缀。

+0

这是很好的知道,并使我的任务更易于管理。尽管我仍然想知道这是否可以在模型绑定过程的幕后完成,因为属性需要不变的值。 – 2010-07-18 14:01:32

+0

也许我原来的问题不清楚。我想知道如何从DefaultModelBinder派生,并根据模型类型添加这个额外的前缀检查。 – 2010-07-20 13:55:09

1

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属性的类型指定使用这种模式粘结剂!

+0

+1的灵感,它帮助我解决了长期运行的问题 – Odys 2014-07-04 20:58:34