2010-07-18 87 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