folgte ich diesen ein pproach in den obigen Blogs verlinkt und ein paar Details hinzugefügt, die für einige hilfreich sein könnten - vor allem, weil ich eine beliebige Anzahl von Zeilen dynamisch hinzufügen wollte, aber AJAX dazu nicht verwenden wollte (ich wollte, dass das Formular nur im Post einreicht)). Ich wollte mir auch keine Gedanken über die Aufrechterhaltung sequentieller IDs machen.Ich war eine Liste von Start- und Enddaten Erfassung:
Ansicht Modell:
public class WhenViewModel : BaseViewModel {
public List<DateViewModel> Dates { get; set; }
//... Other properties
}
Start/End Date Ansicht Modell:
public class DateViewModel {
public string DateID { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
}
Dann sie auf der Seite mit (mit Datumspicker):
<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>
Wie der Blogpost, der im oben beschriebenen @ErikTheVikings-Post verlinkt ist, wird die Sammlung durch das wiederholte verdeckte Element @Html.Hidden("Dates.Index", d.DateID)
für jeden Eintrag in der Sammlung auf der Seite erstellt.
Ich wollte Reihen beliebig hinzufügen, ohne AJAX unter Verwendung von Daten zurück an den Server zu schreiben, die ich eine Vorlage von einer „Reihe“/Stück in der Sammlung eine versteckte div tat, indem enthält:
Versteckt „Vorlage "row:
<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>
dann verwendet jQuery, die die Vorlage Klone stellt eine Zufalls-ID für eine neue Zeile zu verwenden und fügt die nun sichtbar geklont Reihe zum enthält div oben:
jQuery um den Vorgang abzuschließen:
<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 Beispiel für das Ergebnis: http://jsfiddle.net/mdares/7JZh4/
einen Blick auf diese: http://stackoverflow.com/questions/ 7807127/Nicht-sequenzielle-Liste-Bindung-nicht-arbeiten. Die Frage zeigt eine Syntax für nicht-sequenzielle Bindung (und die Antwort bestätigt ihre Verfügbarkeit in MVC2 und höher). Ich habe es gelegentlich benutzt. Zu Ihrer ursprünglichen Frage: Wenn ich mich richtig erinnere, wird es scheitern ... aber es ist einfach genug, es zu versuchen, bevor Sie sich mit manueller indizierter, nicht sequentieller Bindung beschäftigen. –
@TimMedora, Danke - Nicht-sequenzielle Bindung war eine hilfreiche Terminologie, die mir fehlte. – Eric
Das Thema ist überraschend obskur. Wenn Sie nach etwas suchen, gibt es ein paar gute Blogs zu diesem Thema, und dieses Buch behandelt es gut in einem der späteren Kapitel: http://www.amazon.com/Pro-ASP-NET-MVC-3-Framework/dp/1430234040 –