Comprendre les paramètres [HttpPost], [HttpGet] et Complex Actionmethod dans MVC
Je suis très très nouveau pour MVC le dessin-modèle et aussi le Cadre. Je suis également pas très bien versé dans les principes fondamentaux de ASP.NET les Formulaires. Cependant, je comprends les bases du développement web et HTTP Post et GET.
Maintenant, j'ai été en passant par certaines MVC tutoriels et je même si j'ai été d'obtenir un bon maintien de comment MVC le modèle fonctionne et aussi comment le "Moteur de Routage". Puis, soudain, je suis tombé sur un code qui ressemble à folloing:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks", "text/html");
}
}
J'ai quelques questions en la regardant:
- Ma compréhension de moteur de routage est que le contrôle est passé à un particulier ActionMethod basé sur l'URL et normalement l'URL sont fondamentalement Contrôleur/ActionMethod/Id type où le paramètre d'action menthod sont plutôt de type Primitif. Dans cet exemple, au-dessus de ce genre de URL faudrait-il l'appeler "
public ActionResult Index(MyViewModel modèle)?"
Depuis NyViewModel est un type complexe, vous ne pouvez pas passer en tant que partie de l'URL. Comment pouvez-vous l'appeler?
- Pourquoi est cette deuxième méthode orné [HttpPost] lors de la première méthode n'exige pas de ses attributs? Existe-il des lignes directrices sur l'utilisation [Http] attributs et lorsqu'il n'est pas?
Je pense que je suis absent une grande pice du puzzle et les deux questions sont liées. Cependant, vous avez besoin d'aide pour donner un sens à la relation
source d'informationauteur TeaLeave
Vous devez vous connecter pour publier un commentaire.
La
[HttpPost]
attribut indique au moteur de routage pour envoyer toutes les requêtes POST pour que l'action de la méthode à une méthode par rapport à l'autre. C'est un type de surcharge.La valeur par défaut pour une méthode est
[HttpGet]
. À cause de cela, aucun attribut n'est nécessaire.Idéalement, les attributs de chaque méthode, afin d'éviter toute confusion. Comme vous obtenez plus familier avec la façon dont les choses fonctionnent, vous serez souvent amené à prendre des raccourcis (comme tout le reste), et de les omettre lorsque vous savez qu'ils ne sont pas nécessaires.
Les données seront tournés dans le modèle de données dans le corps de la demande. Cela peut provenir soit comme un objet JSON, ou que les données de Formulaire. (Il y a des astuces pour obtenir l'objet initialisé à partir de l'URL, mais ils peuvent être un peu compliqué et avancé.)
Généralement, les objets complexes sont passés dans le corps HTTP avec les verbes qui prennent en charge, comme le POST et le METTRE. Le contenu du corps doit passer de la Liaison de Modèle de validation. Qui signifie essentiellement que si c'est une requête POST avec Content-Type: application/json, il doit désérialiser de JSON dans MyViewModel. Si le contenu est du XML, il doit désérialisation XML.
Convention générale est d'avoir tous les types primitifs qui peut être trouvé dans le chemin de l'URL, la requête, et les en-têtes de premier, puis un type complexe de la POSTE (ou PUT) le corps, après que. Je crois qu'il est possible de mettre des types complexes d'ailleurs, mais alors que vous obtenez dans les convertisseurs de types et attributs personnalisés qui vous devriez faire si vous êtes un débutant.
"[HttpPost]" est à dire le moteur de routage que cette surcharge de la méthode est seulement disponible via HTTP POST. Essaie de METTRE un /home/index avec un corps échouera avec l'erreur 404 Non Trouvé, dans ce cas. Le paramètre-la version gratuite de l'Index() n'en a pas besoin car il peut travailler avec n'importe quel verbe HTTP, y compris GET, POST, et METTRE.
Meilleures Pratiques - traitement de la Demande
Il est préférable d'utiliser uniquement des méthodes publiques de votre contrôleur qui vont être traitées soit avec une vue ou avec json. Pour toutes les méthodes publiques de votre contrôleur, il est préférable soit de les marquer avec un
[HttpGet]
ou un[HttpPost]
ou l'un des autres types qui j'ai l'habitude de couvrir car ils sont plus bord scénario.Ces
Http
attributs de restreindre la méthode uniquement à l'entretien de ces types de demandes. La valeur par défaut est[HttpGet]
j'ai constaté que pas de marquage[HttpGet]
dans tous les scénarios peuvent parfois entraîner un comportement inattendu lorsqu'il y a des conflits de noms.Meilleures Pratiques - PRG
Post-Rediriger-Get est un modèle de conception qui, essentiellement, stipule que, chaque fois que vous allez à l'envoi d'une réponse qui est venue à partir d'une requête POST, vous devez rediriger vers un get pour envoyer la réponse. Cela protège d'un certain nombre de scénarios, y compris pas de poster à nouveau si le bouton de retour est utilisé.
La redirection se présente habituellement sous la forme de la
[HttpPost]
ActionResult à l'aide dereturn RedirectToAction("MyHttpGetAction");
.Affichage des modèles complexes
Il y a plusieurs façons dont vous pouvez envoyer un modèle complexe. La différence principale est que si vous utilisez une requête GET, il est dans l'url, et si vous utilisez une requête POST c'est dans les en-têtes de requête. Si vous utilisez ajax puis, la différence devient floue puisque vous aurez presque toujours l'envoyer dans le corps.