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?

Foi útil?

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 }
           );
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top