2009-01-20 31 views
0

我想知道人們對Phil Haack's Model Binding To A List做出相反處理的最佳方式的想法。我有一個表單,它包含幾個單獨的字段以及使用JQuery動態創建的表單字段。這意味着,當我查詢數據庫以進行編輯時,它將返回一個對象,該對象本身會附加n個對象(每個對象都相同)。「模式綁定到列表」的對面

我想知道人們會建議做什麼來創建窗體的「動態」部分,特別是確保爲下拉列表選擇正確的項目。我有一個模糊的想法,它將涉及查看用戶控制,但我正在努力如何把它放在一起。

形式:從隱藏輸入到第二選擇列表的末尾

<form action="/MyItems/Edit" method="post"> 
    Title: <input type="text" name="Title" value="" /><br /> 
    Description <input type="text" name="Description" value="" /><br /><br /> 

    <input type="hidden" name="myItem.Index" value="0" /> 
    <input id="item[0].Amount" name="item[0].Amount" type="text" value="" /> 
    <select id="item[0].selectA"><option value="1">1</option> 
    <option value="2">2</option><option value="3">3</option></select> 
    <select id="item[0].selectB"><option value="1">1</option> 
    <option value="2">2</option><option value="3">3</option></select> 

    <input type="hidden" name="myItem.Index" value="1" /> 
    <input id="item[1].Amount" name="item[1].Amount" type="text" value="" /> 
    <select id="item[1].selectA"><option value="1">1</option> 
    <option value="2">2</option><option value="3">3</option></select> 
    <select id="item[1].selectB"><option value="1">1</option> 
    <option value="2">2</option><option value="3">3</option></select> 

    <input type="hidden" name="myItem.Index" value="2" /> 
    <input id="item[2].Amount" name="item[2].Amount" type="text" value="" /> 
    <select id="item[2].selectA"><option value="1">1</option> 
    <option value="2">2</option><option value="3">3</option></select> 
    <select id="item[2].selectB"><option value="1">1</option> 
    <option value="2">2</option><option value="3">3</option></select> 
</form> 

一切可以重複n次。即正在從數據庫查詢水合的DTO如下所示:

public class MyItem 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public IEnumerable<SelectItem> SelectItems { get; set; } 
} 

每個SelectItem則看起來像:

public class SelectItem 
{ 
    public int SelectA { get; set; } 
    public int SelectA { get; set; } 
} 

我希望我已經解釋了這行,在此先感謝任何人服用有時間看看這個。

回答

0

爲了完成這個,我最終創建了一個while循環來遍歷表單項,然後查詢我的數據源以保存我的對象。我已經改變了這一點,以便相同的代碼現在位於自定義模型綁定器中。井井有條。

1

在任何一個用戶控件或您自己的HtmlHelper擴展方法會收拾視圖結束語這件事,但本質上,你想是這樣的:

<% int idx = 0; 
    foreach (SelectItem item in myItem.SelectItems) { %> 
<input type="hidden" name="myItem.Index" value="<%= idx %>" /> 
<input id="item[<%= idx %>].Amount" name="item[<%= idx %>].Amount" type="text" value="" /> 
<select id="item[<%= idx %>].selectA"> 
    <option <%= item.selectA == 1 ? "selected" : "" %> value="1">1</option> 
    <option <%= item.selectA == 2 ? "selected" : "" %> value="2">2</option> 
    <option <%= item.selectA == 3 ? "selected" : "" %> value="3">3</option> 
</select> 
<select id="item[<%= idx %>].selectB"> 
    <option <%= item.selectB == 1 ? "selected" : "" %> value="1">1</option> 
    <option <%= item.selectB == 2 ? "selected" : "" %> value="2">2</option> 
    <option <%= item.selectB == 3 ? "selected" : "" %> value="3">3</option> 
</select> 
<% idx++; 
    } %> 

您要的form標籤包裹起來,它應該呈現很好,假設你的MyItem實例被稱爲myItem。如果您的值也保存在集合中,則可以將重複的option標籤封裝在另一個循環中。

+0

謝謝長頸鹿,明天早上我會好好看看,一定會回來。 – dave 2009-01-20 09:36:41