2011-06-29 28 views
0

我有一個複雜的模型包含一個數組。爲了渲染這個數組的項目,我使用的EditorFor是這樣的:在EditorTemplate(在數組中)/多個綁定前綴的後期綁定模型?

for (int i = 0; i < Model.Contacts.Phones.Length; i++) 
{  
    @Html.EditorFor(x => x.Contacts.Phones[i]) 
} 

在編輯器裏面有一個post-form。問題是,綁定成功,只有當我正好指定綁定前綴:

[HttpPost] 
public ActionResult SavePhone(
    [Bind(Prefix = "Contacts.Phones[0]")]Contact5UsedPhone model) 
{ ... } 

所以它僅適用於第一要素。什麼是正確的前綴形式?

對於不同的屬性,也有在同一頁面編輯器 - 但相同類型的模型和相同的動作因此被執行。是否可以設置多個綁定前綴?例如。

[HttpPost] 
public ActionResult SavePhone(
    [Bind(Prefix = "Contacts.Phones[0], Contacts.AnotherPrefix")] 
    Contact5UsedPhone model) 
{ ... } 

謝謝!

編輯 - 型號:

public class ContactsViewModel 
{ 
    public Contact5UsedPhone AddiblePhone {get;set;} 
    public Contact5UsedPhone[] Phones {get;set;} 
    ... 
} 

編輯 - 答案: 我找到了一個解決方案。至於有一個陣列(手機)和一個單一的實體(AddiblePhone),我用了兩個參數,如果簡單:

[HttpPost] 
public ActionResult SavePhone(
    [Bind(Prefix = "Contacts.Phones")]Contact5UsedPhone[] models, 
    [Bind(Prefix = "Contacts.AddiblePhone")]Contact5UsedPhone model) 
{ 
    model = model ?? models[0]; 
    ... 
} 

的問題仍然存在 - 如果有什麼有AddiblePhones爲數組?是否可以爲一個參數使用兩個前綴,還是必須將它分成兩個參數,就像我在這種情況下所做的那樣?

+0

你能後的代碼爲您的視圖模型。您的動作應該有一個IEnumerable 參數,或者作爲viewmodel的一個屬性。 –

+0

已編輯並部分回覆... –

回答

1

我們發現這個簡單明瞭的答案:

@Html.EditorFor(x => x.Phones[i], 
    "~/Views/Contacts/EditorTemplates/Contact5UsedPhone.cshtml", 
    "") 

最後「」意味着它不會使用任何前綴綁定。這很好,所以你不需要任何綁定前綴和兩種可接受的模式,如問題中的答案所示。

一個小問題仍然存在 - 如果有AdorablePhones作爲數組會發生什麼?是否可以爲一個參數使用兩個前綴,還是必須按照我在回答中提出的建議進行劃分?但如果需要類似的東西,這可能是不好的設計...

編輯(Telerik控件): 使用Telerik下拉列表時出現此問題,因爲它不會爲元素生成唯一的ID,而且這些控件都是jQuery控制,因此它不能正常工作。

警告: 我發現,使用Bind屬性時,不能在屬性和參數類型之間使用「」(空格)。

作品:

[Bind(Prefix = "Phones")]Contact5UsedPhone[] 

不起作用:

[Bind(Prefix = "Phones")] Contact5UsedPhone[] 

我不知道這是否是數組的唯一情況。但對我來說似乎很難過。

1
+0

我沒有時間深入研究它,但似乎必須編寫相當多的代碼才能使其工作。我不知道它是否可以處理需要Telerik控制的獨特ID(我之前的編輯),但是如果不能,你可以自己實現它 - 再次編碼。 –

+0

我認爲最好的解決方案是創建自定義IModelBinder並使用它,以便它忽略不相關的前綴,但仍會自動生成ID,以便Teleriks可以工作。尚未測試。 –

+0

@Jozef不知道我跟着你。如果你找到一個,請分享解決方案 –