Ich habe einen MVC-Controller mit dieser Aktionsmethode:
[HttpPost]
public ActionResult SubmitAction()
{
// Get Post Params Here
... return something ...
}
Das Formular ist ein nicht triviales Formular mit einem einfachen Textfeld.
Frage
Wie greife ich auf die Parameterwerte zu?
Ich poste nicht aus einer Ansicht, der Beitrag kommt extern. Ich gehe davon aus, dass es eine Sammlung von Schlüssel / Wert-Paaren gibt, auf die ich Zugriff habe.
Ich habe es versucht, Request.Params.Get("simpleTextBox");
aber es wird der Fehler "Entschuldigung, bei der Bearbeitung Ihrer Anfrage ist ein Fehler aufgetreten." Zurückgegeben.
quelle
Einfach können Sie
FormCollection
wie folgt verwenden :Sie können auch eine Klasse verwenden, die mit Formularwerten verknüpft ist, und die asp.net mvc-Engine füllt sie automatisch aus:
quelle
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.
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.Sie können ein Modell auch ohne Rasiermesser zurückschicken. Ich habe festgestellt, dass dies einige Male benötigt wird.
Das HTML-Markup wird einfach ...
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.
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.
Die Verwendung
List<>
ist in ihrem Markup etwas komplexer.Index on List <> MUSS immer nullbasiert und sequentiell sein. 0,1,2,3.
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.Und der Code muss nur IEnumerable verwenden und aufrufen
ToList()
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.
quelle
Wenn Sie die Formulardaten direkt von der HTTP-Anfrage ohne Modellbindungen abrufen möchten,
FormCollection
können Sie Folgendes verwenden:quelle
Request
und in die Methode injizieren.