2014-02-15 59 views
0

我開始使用.NET MVC 4框架,並試圖找出如何自定義Razor用於表單的數據綁定。例如,我已經在課堂上教過使用類似@Html.TextBoxFor(be => be.Title)的東西來將輸入文本框綁定到Model.Title屬性。但是如果我想通過相同的綁定模型發送自定義控件呢?使用MVC 4自定義數據綁定Razor引擎

例如,我創建了一個博客CMS,併爲標記博客文章定製了「標記」控件。我想將一串字符串數組綁定到我後端的一個List<String>()對象。我怎樣才能使這項工作正確?

回答

0

結合你不需要自定義模型綁定,只需使用語法在Razor視圖列表:

@for (int i = 0; i < Model.SomeCollectionProperty.Count; ++i) 
{ 
    @Html.TextBoxFor(m => m.SomeCollectionProperty[i]) 
} 

這就是說,如果你需要創建一個自定義的模型綁定對於更復雜的情況,您只需實施IModelBinder或覆蓋例如DefaultModelBinderBindProperty方法,並將其註冊到MVC框架。

在第一種情況下,你登記在你global.asaxApplication_Start定製粘合劑,像這樣:

ModelBinders.Binders.Add(typeof(MyFancyType), new MyFancyTypeModelBinder()); 

在第二種情況下,更換像這樣的默認模型綁定:

ModelBinders.Binders.DefaultBinder = new MyExtendedDefaultModelBinder(); 

在這兩種情況下,您的模型聯編程序類都需要是線程安全的,因爲所有http請求都使用相同的模型聯編程序實例。

作爲第三種選擇,你其實可以採取模型綁定建設的全面控制通過實施IModelBinderProvider,並像這樣註冊它:

ModelBinderProviders.BinderProviders.Add(new MyModelBinderProvider()); 

我所知道的是使用ModelBinderAttribute最後一個選項,像這樣

[ModelBinder(typeof(MyCustomModelBinder))] 
public class MyModelClass 
{ 
    public class MyCustomModelBinder : DefaultModelBinder 
    { 
     ... 
    } 
    ... 
} 

在上面的例子中,模型粘合劑實際上嵌套在模型類的內部,但它可以分別被定義爲好。

我傾向於傾向於實施IModelBinder並將其註冊到模型活頁夾字典中 - 因爲這使我可以通過一個簡單的註冊輕鬆地在多個模型中重複使用同一類型。在極少數情況下,我需要完全自定義特定模型的模型綁定,我將使用最後一種方法。

+0

但是如果我從一個新對象開始,並且想要添加到列表中,這意味着它以Count = 0開始。就我而言,您發佈的代碼將用於編輯數據 –

+0

然後你可以使用string.Empty填充你想要允許的許多項目。如果要動態添加項目,可以將新項目追加到發佈操作的列表中,或者通過創建遵循模型綁定命名約定的新元素在客戶端執行。 – Nathan