Domanda

devo registrare il vincolo HttpVerb nella definizione del mio percorso (quando sto registrando i percorsi) se ho già decorato il mio metodo di azione con l'attributo [AcceptVerbs (..)]?

ad es. ho questo.

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

devo aggiungere questo alla rotta che fa riferimento a questa azione, come un vincolo?

È stato utile?

Soluzione

La differenza tra i due è la seguente: supponiamo che il metodo Crea in questione sia sul HomeController .

L'uso dell'attributo AcceptVerbs non influisce sul routing. In realtà è qualcosa usato dall'invocatore di azioni. Ciò che ti consente di fare è avere 2 metodi di azione su un controller con lo stesso nome, ognuno dei quali risponde a un diverso metodo HTTP.

public ActionResult Create(int id) { .. }

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

Quindi quando arriva una richiesta per / home / create , il percorso corrisponderà e consegnerà la richiesta all'invocatore del controller. Il chiamante quindi invoca il metodo corretto osservando l'attributo AcceptVerbs .

L'uso del HttpMethodConstraint nel routing renderà tale che il percorso stesso non corrisponderà alla richiesta. Quindi quando arriva una richiesta POST per / home / create , nessuno dei due metodi di azione verrà chiamato perché quella route non corrisponderà alla richiesta. È possibile che un'altra rotta corrisponda alla richiesta.

Parte del motivo della sovrapposizione qui è che il routing è una funzionalità di ASP.NET 3.5 SP1 e non è specifico di MVC. MVC utilizza il routing, ma il routing viene utilizzato anche dai dati dinamici e prevediamo di integrare il routing con i moduli Web ASP.NET.

Altri suggerimenti

No - Crea risponderà solo alle richieste POST.

Puoi avere altre implementazioni di Crea con diversi attributi AcceptVerb o una senza attributi che catturi tutte le altre richieste.

Se quello fosse l'unico metodo di creazione, qualsiasi richiesta GET (o altro non POST) comporterebbe un 404.

Presumo che sotto il cofano tutto ciò venga comunque fatto dal motore di routing. [modifica: no, vedi il post di Haacked]

Prima decorare in questo modo:

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

quindi devi aggiungere un percorso come questo:

 AddRoute(
                "SampleEdit",
                "Admin/{sampleID}/Edit",
                new { controller = "Sample", action = "ItemEdit", validateAntiForgeryToken = true },
                new { areaID = new IsGuid() },
                new { Namespaces = controllerNamespaces }
           );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top