2010-06-17 5 views
5

In meiner ASP.NET MVC-Site ermöglicht ein Teil einer Funktion die Eingabe der Stunden, wenn ein bestimmter Veranstaltungsort geöffnet ist.ASP.NET MVC-Modell Bindung in eine Liste

Ich habe beschlossen, diese Stunden in einer VenueHours-Tabelle in meiner Datenbank mit einer FK-zu-PK-Beziehung zu einer Venues-Tabelle sowie DayOfWeek-, OpeningTime- und ClosingTime-Parametern zu speichern.

In meiner Ansicht möchte ich dem Benutzer erlauben, nur die Zeiten einzugeben, die sie kennen; Mit anderen Worten, einige Tage dürfen nicht für einen Veranstaltungsort ausgefüllt werden. Ich denke daran, Kontrollkästchen zu erstellen, die der Benutzer aktivieren kann, um die Felder OpeningTime und ClosingTime für die DayOfWeek-Komponente zu aktivieren, zu der das Kontrollkästchen gehört.


Meine Frage bezieht sich auf wie diese Informationen an meine Httppost-Controller Aktion zu übergeben.

Da ich die maximale Anzahl von Tagen kenne, die übergeben werden können (7), könnte ich natürlich nur 7 nullbare VenueHour-Parameter in meine Action schreiben, aber ich bin mir sicher, dass es einen besseren Weg gibt.

Kann ich irgendwie die Informationen in eine Liste binden, die an meine Aktion weitergegeben wird? Dies wird mir auch helfen, wenn ich in ein Szenario stoße, in dem es keine Begrenzung gibt, wie viele Informationen der Benutzer ausfüllen kann.

Antwort

13

Scott Hanselman hat eine very good article über die Verwendung des Standardmodellbinders mit Sammlungen, Arrays und Wörterbüchern veröffentlicht. Es ist großartig, wenn Sie keine benutzerdefinierten Modellbinder schreiben möchten, obwohl das Schreiben eines benutzerdefinierten Modellbinders keine große Sache ist.

+0

Großartig! Werde versuchen, das zu nutzen. –

+0

Ist es auch möglich, ein Attribut [Bind (Exclude = "...")] zu verwenden, um einige Parameter innerhalb jedes Objekts in der Liste nicht zu binden? –

1

Bitte versuchen Sie die folgenden Schritte

1 - Legen Sie alle Eingabefelder innerhalb eines div in der aspx Ansicht (die von JQuery Datepicker Kontrolle bevölkert werden kann).

2 - Verwenden von Jquery-Selektoren, um alle Werte (innerhalb des oben angegebenen DIV), die an die Action-Methode gesendet werden sollen, in ein JavaScript-Array auf der Clientseite zu erfassen.

siehe Filtering input elements inside DIV

var enteredVenueHours = new Array(); 
for(var i=0;i < inputsInsideDiv.length;i++) 
{ 
    // add the elements to the JS array 
} 

3 - die JQuery Post Verwenden Sie die enteredVenueHours zurück an den Controller-Aktion **

$.post('<%=Url.Action("ActionMethod")%>',{ EnteredVenueHours: enteredVenueHours,function (data) 
{ 
    // Udpate status to be displayed here. 
}); 

4 senden - Stellen Sie sicher, dass die Controller-Aktion-Methode hat die folgende Signatur

[AcceptVerbs(HTTP.Post)] 
public ActionResult ActionMethod(List<string> EnteredVenueHours) 
{ 
    // Have the DB persistance logic . 
}