我跟着這個pproach鏈接到上面的博客中,並添加了一些可能對某些人有用的細節 - 特別是因爲我想動態添加任意數量的行但不想使用AJAX來這樣做(我希望表單只能在帖子中提交)。我也不想擔心維護順序ID。我被捕獲的開始和結束日期的列表:
視圖模型:
public class WhenViewModel : BaseViewModel {
public List<DateViewModel> Dates { get; set; }
//... Other properties
}
開始/結束日期視圖模型:
public class DateViewModel {
public string DateID { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
}
然後在頁面中使用它們(帶日期選擇器):
<div class="grid-8-12 clear" id="DatesBlock">
@{
foreach (DateViewModel d in Model.Dates) {
@:<div class="grid-5-12 left clear">
@Html.Hidden("Dates.Index", d.DateID)
@Html.Hidden("Dates[" + d.DateID + "].DateID", d.DateID) //ID again to populate the view model
@Html.TextBox("Dates[" + d.DateID + "].StartDate",
d.StartDate.Value.ToString("yyyy-MM-dd"))
@:</div>
@:<div class="grid-5-12">
@Html.TextBox("Dates[" + d.DateID + "].EndDate",
d.EndDate.Value.ToString("yyyy-MM-dd"))
@:</div>
<script type="text/javascript">
$('input[name="Dates[@d.DateID].StartDate"]')
.datepicker({ dateFormat: 'yy-mm-dd'});
$('input[name="Dates[@d.DateID].EndDate"]')
.datepicker({dateFormat: 'yy-mm-dd'});
</script>
}
}
</div>
<a href="#" onclick="AddDatesRow()">Add Dates</a>
由於在上面的@ErikTheVikings帖子中鏈接的博文描述了該集合,該頁面上的集合中的每個條目通過重複的隱藏元素:@Html.Hidden("Dates.Index", d.DateID)
創建。
隱藏「模板:集合中
我想隨意添加行,而無需使用AJAX發佈數據傳回,我做到了通過創建一個包含一個「行」的模板,一個隱藏的div服務器/項目「行:
<div id="RowTemplate" style="display: none">
<div class="grid-5-12 clear">
@Html.Hidden("Dates.Index", "REPLACE_ID")
@Html.Hidden("Dates[REPLACE_ID].DateID", "REPLACE_ID")
@Html.TextBox("Dates[REPLACE_ID].StartDate", "")
</div>
<div class="grid-5-12">
@Html.TextBox("Dates[REPLACE_ID].EndDate", "")
</div>
</div>
然後使用jQuery的哪些克隆的模板,提供了一種隨機ID以用於新的行和附加的現在可見克隆行內含div以上:
jQuery來完成這一過程:
<script type="text/javascript">
function AddDatesRow() {
var tempIndex = Math.random().toString(36).substr(2, 5);
var template = $('#RowTemplate');
var insertRow = template.clone(false);
insertRow.find('input').each(function(){ //Run replace on each input
this.id = this.id.replace('REPLACE_ID', tempIndex);
this.name = this.name.replace('REPLACE_ID', tempIndex);
this.value = this.value.replace('REPLACE_ID', tempIndex);
});
insertRow.show();
$('#DatesBlock').append(insertRow.contents());
//Attach datepicker to new elements
$('input[name="Dates['+tempIndex+'].StartDate"]')
.datepicker({dateFormat: 'yy-mm-dd' });
$('input[name="Dates['+tempIndex+'].EndDate"]')
.datepicker({dateFormat: 'yy-mm-dd' });
}
</script>
結果的jsfiddle例如:http://jsfiddle.net/mdares/7JZh4/
看看這個:http://stackoverflow.com/questions/ 7807127 /非順序列表結合 - 不工作。該問題顯示了非順序綁定的語法(並且答案確認了它在MVC2及更高版本中的可用性)。我有時使用過它。至於你原來的問題:如果我記得正確的話,它會失敗......但在打亂手動索引,非順序綁定之前,嘗試很容易。 – 2013-02-11 23:11:11
@TimMedora,謝謝 - 非順序綁定是我缺乏的有用的術語。 – Eric 2013-02-11 23:22:28
這個話題令人驚訝的模糊。如果你四處搜索,有關於這個主題的一些好博客,本書將在後面的章節中詳細介紹:http://www.amazon.com/Pro-ASP-NET-MVC-3-Framework/dp/1430234040 – 2013-02-11 23:29:14