Comment @Html.BeginForm() fonctionne?
Je suis très nouveau pour ASP.NET, juste commencé à le MVC tutoriel d'aujourd'hui sur asp.net. Je suis arrivé ici http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view
C'est très bien, le problème:
De mon point de Vue j'ai le code suivant
(Le modèle est défini à la vue avec @modèle MyFirstMVC4.Modèles.Film)
@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>
}
Mon 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);
}
Et voici la question - Comment diable est-il pass le Film de l'objet de la méthode POST ci-dessus?! Quand j'observe le côté client, il est
<form action = "/Movie/Edit/1" ... />
Ici, je ne comprends pas pourquoi action = url de la très même façon de voir la page?!1
Également sur le côté serveur il n'y a que de l'Html.BeginForm() 🙁
Comment elle fait pour se rendre compte à quel méthode d'action de la poste et ce que les paramètres de la route pour passer?
Il fonctionne, je ne sais pas pourquoi
Vous devez vous connecter pour publier un commentaire.
La version de
BeginForm
dans le code,sans paramètres, envoie un HTTP POST à l'URL courante, donc si la vue est une réponse à
/Movie/Edit/5
, le formulaire d'ouverture de la balise se présente comme suit:< form action="/Movie/Edit/5" method="post">
L'assistance HTML BeginForm demande au moteur de routage comment arriver à le Modifier l'action de la
MovieController. Derrière les coulisses, il utilise la méthode nommée GetVirtualPath sur les Routes
propriété exposée par RouteTable — c'est là que votre application web a enregistré toutes ses routes
mondiale.asax. Si vous avez fait tout cela sans un helper HTML, vous devriez écrire de toutes les conditions suivantes
code:
Vous avez demandé comment est le film de l'objet est passé. Qui est appelé modèle de liaison.
Quand vous avez une action avec un paramètre, le runtime MVC utilise un modèle de classeur pour construire le
le paramètre. Vous pouvez avoir plusieurs classeurs de modèle inscrit dans le MVC d'exécution pour les différents types
de modèles, mais le bourreau de travail par défaut sera le
DefaultModelBinder
.Dans le cas d'un Film
l'objet, le modèle de classeur par défaut inspecte le Film et trouve toutes les propriétés de film disponibles
pour la liaison. Suivant la convention de nommage que vous examinées plus haut, le modèle de classeur par défaut peut convertir automatiquement et déplacer les valeurs de la requête dans un objet vidéo (le modèle liant peut
également créer une instance de l'objet à remplir).
En d'autres termes, lorsque le modèle de classeur voit un Film a un Titre de propriété, il semble, pour une valeur
nommé “Titre” dans la requête. Avis le modèle de classeur ressemble “à la demande” et non pas “dans le formulaire
collection”. Le modèle de classeur utilise des composants connus en tant que fournisseurs de valeurs pour rechercher des valeurs dans
les différentes zones d'une demande.
Le modèle de classeur pouvez regarder les données de la route, la chaîne de requête, et la forme
collection, et vous pouvez ajouter de la valeur en douane des fournisseurs si vous le désirez.
@Html.BeginForm
- je fourniHtml.BeginForm("Edit", "Movies", FormMethod.Post)
. Avis je n'ai pas la fourniture de la troisièmeid
partie de l'itinéraire. Pourtant, dans le résultat de balisage, il est là:/Movies/Edit/4
. Comment fait-il cela? Si je lui donnerHtml.BeginForm("Delete", "Movies", FormMethod.Post)
, le HTML n'a pas leid
:/Movies/Delete
.Lorsque vous appelez
BeginForm()
sans paramètres par défaut en utilisant le même contrôleur/action utilisé pour le rendu de la page en cours. Il suppose que vous aurez une action avec le nom correct de votre contrôleur qui va accepter de publications (dont vous faites). Il utilise leRouteValues
pour ce faire.Il lie automatiquement à chaque entrée de contrôle (par le nom) pour les paramètres de l'action en acceptant la publication ou, dans votre cas, les propriétés de l'objet en paramètre pour l'action en acceptant la publication.
[HttpPost]
attribut est donnée à l'action que vous souhaitez être appelé sur le POSTE de soumettre le formulaire.de comprendre comment
@using (Html.BeginForm())
fonctionne , vous avez besoin de savoir à quelle page c'est déjà fait . à l'aide de@using (Html.BeginForm())
dans 2 différents points de vue seront revenir à deux contrôleurs différentsNous pouvons créer des formulaires en tapant html simple ou en html helpers.
L'un d'eux Html.BeginForm(); c'est un peu bizarre, parce qu'en fait vous pouvez l'envelopper dans une instruction d'utilisation parce que cet helper retourne un objet qui implémente IDisposable en C#. D'abord il écrit avec la balise d'ouverture. Et dans le bas lorsque le code généré des appels jeter sur cet objet, c'est quand il va écrire la balise de fermeture du formulaire . Donc BeginForm me donne un objet qui permet de rédiger mon formulaire d'ouverture et la balise de mon la fermeture de la balise. Après que vous n'avez pas à vous soucier de rien, vous pouvez vous concentrer uniquement sur les étiquettes et les entrées