Question

Dois-je enregistrer la contrainte HttpVerb dans ma définition d'itinéraire (lorsque j'enregistre des itinéraires) si j'ai déjà décoré ma méthode d'action avec l'attribut [AcceptVerbs (..)]?

par exemple. J'ai ceci.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }

Dois-je ajouter ceci à la route qui fait référence à cette action, en tant que contrainte?

Était-ce utile?

La solution

La différence entre les deux est la suivante: supposons que la méthode Create en question se trouve sur le HomeController .

L'utilisation de l'attribut AcceptVerbs n'affecte pas le routage. C'est en fait quelque chose utilisé par l'invocateur d'action. Cela vous permet d’avoir deux méthodes d’action sur un contrôleur du même nom qui répondent chacune à une méthode HTTP différente.

public ActionResult Create(int id) { .. }

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection) { .. }

Ainsi, lorsqu'une demande pour / home / create arrive, la route sera identique et transmettra la demande à l'appelant du contrôleur. L'appelant appelle ensuite la méthode correcte en consultant l'attribut AcceptVerbs .

L'utilisation de HttpMethodConstraint dans le routage permettra à la route de ne pas correspondre à la demande. Ainsi, lorsqu'une demande POST arrive pour / home / create , aucune méthode d'action ne sera appelée car cette route ne correspondra pas à la demande. Il est possible qu'une autre route corresponde à cette demande.

Une des raisons du chevauchement est que le routage est une fonctionnalité d’ASP.NET 3.5 SP1 et n’est pas spécifique à MVC. MVC utilise le routage, mais le routage est également utilisé par Dynamic Data et nous prévoyons d'intégrer le routage aux formulaires Web ASP.NET.

Autres conseils

Nope - Create ne répondra qu'aux demandes POST.

Vous pouvez avoir d'autres implémentations de Create avec différents attributs AcceptVerb, ou une implémentation sans attribut qui interceptera toutes les autres requêtes.

S'il s'agissait de votre seule méthode Create, toute requête GET (ou autre requête non-POST) donnerait lieu à une requête 404.

Je suppose que sous le capot, le moteur de routage se charge de toute façon. [edit: nope, voir le post de Haacked]

Décorez d'abord comme ça:

[ActionName("ItemEdit"), AcceptVerbs(HttpVerbs.Post)]
public virtual object ItemSave(Menu sampleInput)

alors vous devez ajouter une route comme ceci:

 AddRoute(
                "SampleEdit",
                "Admin/{sampleID}/Edit",
                new { controller = "Sample", action = "ItemEdit", validateAntiForgeryToken = true },
                new { areaID = new IsGuid() },
                new { Namespaces = controllerNamespaces }
           );
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top