Die Antworten sind sehr gut, aber es gibt in der neuesten Version von MVC und .NET einen anderen Weg, den ich wirklich gerne verwende, anstelle der FormCollection- und Request-Schlüssel der "alten Schule".
Stellen Sie sich ein HTML-Snippet vor, das in einem Formular-Tag enthalten ist, das entweder einen AJAX- oder einen FORM-POST ausführt.
<input type="hidden" name="TrackingID"
<input type="text" name="FirstName" id="firstnametext" />
<input type="checkbox" name="IsLegal" value="Do you accept terms and conditions?" />
Ihr Controller analysiert die Formulardaten tatsächlich und versucht, sie Ihnen als Parameter des definierten Typs zu liefern. Ich habe das Kontrollkästchen eingefügt, weil es schwierig ist. Es gibt Text "on" zurück, wenn aktiviert, und null, wenn nicht aktiviert. Die Anforderung ist jedoch, dass diese definierten Variablen vorhanden sein MÜSSEN (es sei denn, nullable (denken Sie daran, obwohl dies string
nullable ist)), andernfalls schlägt die AJAX- oder POST-Rückmeldung fehl.
[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}
Sie können ein Modell auch ohne Rasiermesser zurückschicken. Ich habe festgestellt, dass dies einige Male benötigt wird.
public Class HomeModel
{
public int HouseNumber { get; set; }
public string StreetAddress { get; set; }
}
Das HTML-Markup wird einfach ...
<input type="text" name="variableName.HouseNumber" id="whateverid" >
und Ihr Controller (Razor Engine) fängt die Formularvariable "variableName" ab (Name ist wie Sie möchten, aber halten Sie ihn konsistent) und versucht, ihn aufzubauen und in MyModel umzuwandeln.
[HttpPost]
public ActionResult PostBack(HomeModel variableName){
postBack.HouseNumber; //The value user entered
postBack.StreetAddress; //the default value of NULL.
}
Wenn ein Controller ein Modell erwartet (in diesem Fall HomeModel), müssen Sie nicht ALLE Felder definieren, da der Parser sie nur auf dem Standardwert belässt, normalerweise NULL. Das Schöne ist, dass Sie verschiedene Modelle im Mark-up kombinieren können und die Post-Back-Analyse so viel wie möglich ausfüllt. Sie müssen kein Modell auf der Seite definieren oder Helfer verwenden.
TIPP: Der Name des Parameters in der Steuerung ist der im HTML-Markup "name =" definierte Name, nicht der Name des Modells, sondern der Name der erwarteten Variablen im!
Die Verwendung List<>
ist in ihrem Markup etwas komplexer.
<input type="text" name="variableNameHere[0].HouseNumber" id="id" value="0">
<input type="text" name="variableNameHere[1].HouseNumber" id="whateverid-x" value="1">
<input type="text" name="variableNameHere[2].HouseNumber" value="2">
<input type="text" name="variableNameHere[3].HouseNumber" id="whateverid22" value="3">
Index on List <> MUSS immer nullbasiert und sequentiell sein. 0,1,2,3.
[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
int counter = MyHomes.Count()
foreach(var home in MyHomes)
{ ... }
}
Verwendung IEnumerable<>
für nicht auf Null basierende und nicht sequentielle Indizes. Wir müssen eine zusätzliche versteckte Eingabe hinzufügen, um dem Ordner zu helfen.
<input type="hidden" name="variableNameHere.Index" value="278">
<input type="text" name="variableNameHere[278].HouseNumber" id="id" value="3">
<input type="hidden" name="variableNameHere.Index" value="99976">
<input type="text" name="variableNameHere[99976].HouseNumber" id="id3" value="4">
<input type="hidden" name="variableNameHere.Index" value="777">
<input type="text" name="variableNameHere[777].HouseNumber" id="id23" value="5">
Und der Code muss nur IEnumerable verwenden und aufrufen ToList()
[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
int counter = variableNameHere.ToList().Count()
foreach(var home in variableNameHere)
{ ... }
}
Es wird empfohlen, pro Seite ein einzelnes Modell oder ein ViewModel (Modell, das andere Modelle enthält, um ein komplexes Ansichtsmodell zu erstellen) zu verwenden. Das vorgeschlagene Mischen und Anpassen kann als schlechte Praxis angesehen werden, aber solange es funktioniert und lesbar ist, ist es nicht schlecht. Es zeigt jedoch die Leistung und Flexibilität des Razor-Motors.
Wenn Sie also etwas Willkürliches eingeben oder einen anderen Wert eines Razor-Helfers überschreiben müssen oder einfach keine eigenen Helfer für ein einzelnes Formular erstellen möchten, das eine ungewöhnliche Kombination von Daten verwendet, können Sie diese Methoden schnell verwenden, um zusätzliche Werte zu akzeptieren Daten.