it-swarm.com.de

Wie funktioniert @ Html.BeginForm ()?

Ich bin sehr neu in ASP.NET, ich habe gerade das MVC-Tutorial heute auf asp.net gestartet. Ich habe hier http://www.asp.net/mvc/tutorials/mvc-4/getting-startedwithwithaspnet-mvc4/examining-the-edit-methods-and-edit-view

So weit so gut, das Problem:

In meiner Ansicht habe ich den folgenden Code (Das Modell wird mit @model MyFirstMVC4.Models.Movie auf die Ansicht festgelegt.)

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Movie</legend>

        @Html.HiddenFor(model => model.ID)

        //... bla bla html input
        <p>
             <input type="submit" value="Save" />
        </p>
    </fieldset>
}

Mein MovieController 

    // Shows the view
    public ActionResult Edit(int id = 0)
    {
        Movie movie = db.Movies.Find(id);
        if (movie == null)
        {
            return HttpNotFound();
        }
        return View(movie);
    }

    //
    // POST: /Movie/Edit/5

    [HttpPost] // Handles the view above
    public ActionResult Edit(Movie movie)
    {
        if (ModelState.IsValid)
        {
            db.Entry(movie).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(movie);
    }

Und hier ist die Frage - wie zum Teufel übergibt es das Movie-Objekt an die oben beschriebene Methode POST ?! Wenn ich die Kundenseite beobachte, gibt es das

<form action = "/Movie/Edit/1" ... />

Hier verstehe ich nicht, warum action = url der gleichen View-Seite?! 1 Auch auf der Serverseite gibt es nur Html.BeginForm (): ( Wie erkennt man, welche Aktionsmethode zu posten ist und welche Routenparameter übergeben werden sollen? Es funktioniert, ich weiß nur nicht warum

19
Ivan Prodanov

Die Version von BeginForm im Code, Ohne Parameter, sendet ein HTTP POST an die aktuelle URL. Wenn die Ansicht eine Antwort auf /Movie/Edit/5 ist, sieht das öffnende Formular-Tag wie folgt aus :< form action="/Movie/Edit/5" method="post">

Der BeginForm-HTML-Helper fragt die Routing-Engine, wie sie die Edit-Aktion des MovieController erreichen können. Hinter den Kulissen wird die Methode "GetVirtualPath" für "Routesproperty" verwendet, die von RouteTable bereitgestellt wird. Hierbei hat Ihre Webanwendung alle ihre Routen in Global.asax registriert. Wenn Sie dies alles ohne einen HTML-Helper erledigen, müssen Sie den folgenden -Code schreiben:

  @{
 var context = this.ViewContext.RequestContext;
  var values = new RouteValueDictionary{
  { "controller", "movie" }, { "action", "edit" }
 };
  var path = RouteTable.Routes.GetVirtualPath(context, values);
 }
 <form action="@path.VirtualPath" method="get">
  ...
 </form>

Sie haben gefragt, wie das Filmobjekt übergeben wird. Das wird .. genannt modellbindungWenn Sie eine Aktion mit einem Parameter haben, verwendet die MVC-Laufzeitumgebung einen Modellbinder zum Erstellen des Parameters Sie können mehrere Modellbinder in der MVC-Laufzeit für verschiedene Typen von Modellen registrieren. Das Arbeitstier ist jedoch standardmäßig die Variable DefaultModelBinder.

Im Falle eines Movie -Objekts überprüft der Standard-Modellbinder den Movie und sucht alle verfügbaren Movie-Eigenschaften Zum Binden. Gemäß der zuvor genannten Namenskonvention kann der Standard-Modellbinder automatisch Werte aus der Anforderung in ein Filmobjekt konvertieren und verschieben (der Modellbinder kann Auch eine Instanz des zu befüllenden Objekts erstellen) . Mit anderen Worten Wenn der Modellbinder sieht, dass ein Film eine Title-Eigenschaft hat, sucht er in der Anforderung nach einem Wert namens "Title". Beachten Sie, dass der Modellbinder "in der Anforderung" und nicht "in der Auflistung von Form " Angezeigt wird. Der Modellbinder verwendet als Wertanbieter bekannte Komponenten, um in Verschiedenen Bereichen einer Anforderung nach Werten zu suchen Der Modellbinder kann Routendaten, die Abfragezeichenfolge und die Auflistung von Form Anzeigen. Sie können benutzerdefinierte Wertanbieter hinzufügen, wenn Sie dies wünschen.

38
Vlado Pandžić

Wenn Sie BeginForm() ohne Parameter aufrufen, werden standardmäßig die gleichen Controller/Aktionen verwendet, mit denen die aktuelle Seite gerendert wird. Es wird davon ausgegangen, dass Sie eine Aktion mit dem richtigen Namen auf Ihrem Controller haben, die Postbacks akzeptiert (was Sie tun). Es verwendet dazu die Variable RouteValues.

Es bindet jedes Eingabesteuerelement (nach Name) automatisch an die Parameter der Aktion, die das Postback akzeptiert - oder in Ihrem Fall die Eigenschaften des Objektparameters für die Aktion, die das Postback akzeptiert.

9
Nick Albrecht

Das [HttpPost]-Attribut wird der Aktion zugewiesen, die beim Senden des Formulars POST aufgerufen werden soll.

um zu verstehen, wie @using (Html.BeginForm()) funktioniert, müssen Sie wissen, auf welcher Seite es sich bereits befindet. Wenn Sie @using (Html.BeginForm()) in zwei verschiedenen Ansichten verwenden, werden zwei verschiedene Controller angezeigt

4
Scott Selby

Wir können Formulare erstellen, indem Sie einfache HTML- oder HTML-Helfer eingeben. Einer davon Html.BeginForm (); Es ist ein bisschen seltsam, weil Sie es tatsächlich in eine using-Anweisung einschließen können, da dieser Helfer ein Objekt zurückgibt, das IDisposable in C # implementiert. Zuerst schreibt es mit dem Anfangs-Tag. Und am Ende, wenn die generierten Codeaufrufe über dieses Objekt verfügen, schreibt es das schließende Form-Tag aus. BeginForm gibt mir also ein Objekt, das mein öffnendes Form-Tag und mein schließendes Tag ausschreibt. Danach müssen Sie sich um nichts mehr kümmern, Sie können sich nur auf Labels und Eingaben konzentrieren

0