我使用的是asp.net mvc 3,並且認爲處理這種情況的最好方法是。視圖模型綁定如何工作? +使用視圖模型處理動態控件的最佳方式?
說我有一個創建獎勵結構的表單。在這種情況下,他們可以獎勵
例如
$100 to $500 - get .05% back
$501 to $1000 - get 0.6% back
$1001 to $1001 - get 0.7% back
and so forth.
現在,這些層在我創建表單中輸入的多層次。可能有一個獎勵層,或者可能有5層或50層。我只是不知道。
選項1
製作的人工限制說5層。如果他們只需要一個層次,他們仍然需要通過嚮導表單(通過jQuery),我正在創建並跳過下一個4層屏幕(他們需要填寫很多字段,所以我決定做出來一個巫師,所以它不會一下子壓倒一切)。
public class MasterVm
{
public IList<TiersVm> Tiers { get; set; }
public MasterVm()
{
Tiers = new List<TiersVm>();
}
}
@for (int i = 0; i < Model.Tiers.Count; i++)
{
@Html.LabelFor(x => x.Tiers[i].StartOfRange, "Start Of Range")
@Html.TextBoxFor(x => x.Tiers[i].StartOfRange)
@Html.LabelFor(x => x.Tiers[i].EndOfRange, "End Of Range")
@Html.TextBoxFor(x => x.Tiers[i].EndOfRange)
// more fields here
}
在我的控制器中,我會做5個佔位符,所以for循環會去5次左右。
選項2
使窗體具有產生另一層按鈕。他們點擊它,另一層將被製作。這樣,如果他們只有一個,他們只能看到一次,如果他們有100個,這並不重要。
我想使用jQuery克隆來實現這一點,但我真的不知道視圖模型綁定是如何工作的。它看起來是ID嗎?或名字?
當我做一個選擇我的所有控件看起來像這樣
<input id="Tiers_0__StartOfRange" type="text" value="0" name="Tiers[0].StartOfRange">
它們都具有唯一的ID(什麼是好的)和唯一的名稱。我不確定在克隆代碼中是否應該刪除ID和名稱。還是我需要在那裏有代碼來生成id和上面的名字?
我將通過使用jquery.serializeArray()通過ajax提交這一切,並在控制器中我將有一個參數與視圖模型也應該綁定。
嘿,你知道如果有可能具有強類型的BeginCollectionItem()嗎?將會比硬編碼更好。幫手也會更改綁定。我有一個視圖,我有BeginCollectionItem(),我有一個foreach循環,當通過視圖模型的集合。那個人永遠不會再綁定了。我也必須使用BeginCollectionItem()來綁定它。 – chobo2 2011-12-19 21:27:47
你是什麼意思的強類型?你的意思是@using(Html.BeginCollectionItem(「StonglyTypeThis」)){'..?據我所知,沒有。要回答你的其他問題,我不認爲它應該改變默認的模型聯編程序的行爲。它只是使用HTML中的.index隱藏字段作爲集合的索引器。 – danludwig 2011-12-19 22:08:36
我的意思是像Html.BeginCollectionItem(x => x.Tiers)。我有一些問題,我的觀點http://stackoverflow.com/questions/8568160/steve-sandersons-begincollectionitem-helper-wont-bind-correctly我會嘗試一些事情,並試圖看看它是否是這個幫手這是造成它。 – chobo2 2011-12-19 22:11:59