Wie funktioniert die controller-Parameter empfangen, auf HttpPost Methoden?
Nehmen Sie dieses snippet aus einem controller, zum Beispiel:
public ActionResult Login()
{
if (User.Identity.IsAuthenticated)
{
return RedirectToAction("Index", "Home");
}
else
{
return View();
}
}
//
//POST: /User/Login
[HttpPost]
public ActionResult Login(LoginModel lm, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(lm.UserName, lm.Password))
{
FormsAuthentication.SetAuthCookie(lm.UserName, lm.RememberMe);
if (Url.IsLocalUrl(returnUrl) &&
returnUrl.Length > 0 &&
returnUrl.StartsWith("/") &&
!returnUrl.StartsWith("//") &&
!returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "Username and Password combination is incorrect");
}
}
return View();
}
Meine Frage ist, mit der überladenen Methode der Login()
(für die HTTP-POST), was ruft diese Methode mit dem ersten parameter als LoginModel
Klasse und der zweite parameter als string
? Mein Login.cshtml-Ansicht verwendet einen submit-button, so bin ich neugierig, wie diese Parameter übergeben bekommen, um die Login()
Methode? Was ist, um mich zu stoppen hinzufügen eines Dritten Parameters? Und wie würde das parameter übergeben bekommen??
Ich weiß, das ist eine grundlegende Frage, ich versuche nur zu verstehen, das Verbindungsstück zwischen Views und Controllern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Vorgang wird als Modell der Bindung, die viele Ressourcen drauf...ich würde beginnen mit zum implementieren eines benutzerdefinierten man denn aus, dass Sie dann verstehen, wie und warum das Verfahren funktioniert.
http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/
http://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.html
EDIT:
Es ist ein Standard-Modell Bindemittel, das vorhanden ist, nimmt Gegenstände in der post collection wie Formulardaten und url-Parameter und versucht, Sie mit Dingen, die Sie gesagt haben, die controller zu erwarten. Es funktioniert ungefähr so...
Kommt auf Anfrage,
MVC entscheidet, welcher controller sollte erhalten die Anfrage,
MVC schaut sich dann die HTTP-Methode, war es ein GET oder POST?
Wenn es ein post, dann sieht es für die controller-Aktion, mit der HttpPost-Attribut
MVC schaut sich dann die Parameter, die Sie definiert haben...
In Ihrem Fall ist es sagt ich habe eine LoginModel und ein returnUrl;
MVC ist jetzt glücklich - es weiß, wo die Dinge laufen so, jetzt sieht es so aus, dass Sie geschickt...
Es sieht bei deinem post-Daten (Formular-Felder und query-string-Parameter)
One by One EDV-schaut auf Ihren Namen und dann versucht, eine übereinstimmung zu finden, die in Ihrem controller-Parameter.
Es findet eine Username-Feld in der Formular-Daten, braucht es einen Blick auf Ihre Parameter und fragt, ob es einen Benutzernamen? Nein, naja vielleicht Benutzername ist eine Eigenschaft von LoginModel...Sie schaut dann durch LoginModel. Aha er sagt, gefunden. MVC erstellt dann eine Instanz von LoginModel und legt die Username-Eigenschaft auf den Wert, den Sie gebucht.
Dieser Prozess wird fortgesetzt, für jedes der Dinge, die er findet in deinem Formular und der Abfrage-string. Es gibt eine Reihe von Regeln folgt, aber Sie erhalten das Bild - das passende ist Teil der 'Konvention über Konfiguration' Schönheit von MVC.
Dieser ganze Prozess über it-Modell verbindlich, und da MVC implementiert das Standard-Verhalten sieht man es nicht geschrieben in der Global.asax, oder alles, es ist nur ein Teil des MVC.
IModelBinder
, und es ist kein code in meinerApplication_Start()
Methode aufruftModelBinders.Binders.Add()
. Bin ich etwas fehlt? Noch nicht zu sehen, und wie die Ansicht übergibt zwei Parameter wissentlich.<input />
Kontrolle in meinem markup. Wenn dieser angeklickt wird, sendet es, aber wo ist derreturnUrl
kommen?? Ist das nur ein capture in der Lage, parameter auf einen submit-button?Werfen Sie einen Blick auf Ihre Anmeldeinformationen anzeigen, das ist, wo die post-Methode wird die returnUrl-parameter
Html.BeginForm("Anmelden", "Konto", neue { returnUrl = @Anfrage.QueryString["ReturnUrl"] }