ASP.NET MVC AcceptVerbs e rotas que registam
-
08-07-2019 - |
Pergunta
eu tenho que registrar o HttpVerb restrição na minha definição de rota (quando eu estou registrar rotas) se eu ter decorado o meu método de ação com as [AcceptVerbs (..)] atributo já?
por exemplo. eu tenho isso.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }
eu preciso adicionar isso para a rota que se refere a esta ação, como uma restrição?
Solução
A diferença entre os dois é a seguinte:. Vamos supor que o método Create
em questão está no HomeController
Usando o atributo AcceptVerbs
não afeta roteamento. É realmente algo usado pelo chamador de ação. O que lhe permite fazer é ter 2 métodos de ação em um controlador com o mesmo nome que cada respondem a um HTTP diferente Método.
public ActionResult Create(int id) { .. }
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection) { .. }
Assim, quando um pedido de /home/create
vem, a rota irá corresponder e mão fora o pedido para invoker do controlador. O chamador, em seguida, chama o método correto, olhando para o atributo AcceptVerbs
.
Usando o HttpMethodConstraint
no roteamento irá torná-lo de tal forma que a própria rota não irá corresponder à solicitação. Assim, quando um pedido POST chega para /home/create
, nem método de ação será chamado porque a rota não irá corresponder à solicitação. É possível que outra rota irá corresponder ao pedido embora.
A parte da razão para a sobreposição aqui é que o roteamento é um recurso do ASP.NET 3.5 SP1 e não é específico para MVC. MVC usa Routing, mas roteamento também é usado por Dynamic Data e pretendemos integrar roteamento com ASP.NET Web Forms.
Outras dicas
Nope -. Criar só vai responder a solicitações POST
Você pode ter outras implementações de Criar com diferentes atributos AcceptVerb, ou um com nenhum atributo que vai pegar todos os outros pedidos.
Se esse era o seu método só Criar, qualquer GET (ou outro não-POST) pedido resultaria em um 404.
Eu assumo sob o capô tudo isto é que está sendo feito pelo mecanismo de roteamento de qualquer maneira. [Editar: Não, veja o post de Haacked]
Primeiro decorar assim:
[ActionName("ItemEdit"), AcceptVerbs(HttpVerbs.Post)]
public virtual object ItemSave(Menu sampleInput)
então você precisa adicionar rota como esta:
AddRoute(
"SampleEdit",
"Admin/{sampleID}/Edit",
new { controller = "Sample", action = "ItemEdit", validateAntiForgeryToken = true },
new { areaID = new IsGuid() },
new { Namespaces = controllerNamespaces }
);