Tôi đã theo dõi pproach được liên kết trong các blog ở trên và thêm một vài chi tiết có thể hữu ích cho một số người - đặc biệt khi tôi muốn tự động thêm bất kỳ số hàng nào nhưng không muốn sử dụng AJAX để làm như vậy (tôi muốn biểu mẫu chỉ gửi trong bài đăng). Tôi cũng không muốn lo lắng về việc duy trì các id tuần tự.Tôi đã chiếm được một danh sách bắt đầu và ngày kết thúc:
Xem mẫu:
public class WhenViewModel : BaseViewModel {
public List<DateViewModel> Dates { get; set; }
//... Other properties
}
Start/End Date View mẫu:
public class DateViewModel {
public string DateID { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
}
Sau đó sử dụng chúng trong trang (với datepicker):
<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>
Khi bài đăng trên blog được liên kết trong bài đăng @ErikTheVikings ở trên mô tả, bộ sưu tập được tạo bởi yếu tố ẩn lặp đi lặp lại: @Html.Hidden("Dates.Index", d.DateID)
cho mỗi mục nhập trong bộ sưu tập trên trang.
Tôi muốn tùy tiện thêm hàng mà không cần sử dụng AJAX để gửi dữ liệu trở lại máy chủ mà tôi đã làm bằng cách tạo ra một div ẩn chứa một mẫu của một "hàng"/mục trong bộ sưu tập:
Hidden "Template "hàng:
<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>
Sau đó, sử dụng jQuery mà bắt chước mẫu, cung cấp một id ngẫu nhiên để sử dụng cho một hàng mới và gắn thêm hàng nhân bản hiện nay có thể nhìn thấy div chứa trên:
jQuery để hoàn tất quá trình:
<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>
dụ JSFiddle của kết quả: http://jsfiddle.net/mdares/7JZh4/
Hãy xem này: http://stackoverflow.com/questions/ 7807127/non-sequential-list-binding-not-working. Câu hỏi cho thấy một cú pháp cho ràng buộc không tuần tự (và câu trả lời xác nhận tính khả dụng của nó trong MVC2 và cao hơn). Tôi đã sử dụng nó nhân dịp. Như câu hỏi ban đầu của bạn: Nếu tôi nhớ lại chính xác, nó sẽ thất bại ... nhưng nó đủ dễ dàng để thử trước khi bạn bận tâm với hướng dẫn sử dụng lập chỉ mục, không tuần tự ràng buộc. –
@TimMedora, Cảm ơn - không ràng buộc tuần tự là một phần thuật ngữ hữu ích mà tôi thiếu. – Eric
Chủ đề đáng ngạc nhiên là không rõ ràng. Nếu bạn tìm kiếm xung quanh có một vài blog hay về chủ đề này, và cuốn sách này trình bày nó ở một trong các chương sau: http://www.amazon.com/Pro-ASP-NET-MVC-3-Framework/dp/1430234040 –