2012-04-20 10 views
5

Quando si manipolano i dati in un'azione, si riceve spesso un ID come param, ma è necessario eseguire una gestione degli errori per tale id. Uno degli errori di gestione che devi fare per ogni azione è assicurarsi che l'ID sia superiore a 0 (non un numero negativo). Quindi, invece di gestirlo nell'azione, ho voluto aggiungere un vincolo del percorso in modo che non si diriga verso l'azione se è un ID negativo.Errore di vincolo di percorso al POST

Ecco il mio codice:

//route definition 
     routes.MapRoute(
      "default route" , 
      "{controller}/{action}/{id}" , 
      new { id = UrlParameter.Optional }, 
      new { id = @"^\d+$" } 
     ); 

//action definition (note I also tried with only [HttpPost] and with nothing same result 
     [AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 
     public ActionResult Edit(int id) 

Tutto funziona bene quando si fa un GET l'azione, ma quando ho Post ottengo il seguente errore quando si deve solo andare alla pagina 404

HTTP verb POST used to access path '/object/edit/-2' is not allowed. 

[HttpException (0x80004005): The HTTP verb POST used to access path '/object/edit/-2' is not allowed.] 
    System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) +740 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +632 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +194 

Qualche idea? Forse una soluzione migliore?

EDIT: qualcosa Appena notato interessante, inizialmente ho pensato che il messaggio di errore è stato un 500, ma è un 405 che è "il metodo non trovato"

+0

stai facendo una riscrittura di URL? I percorsi nella tua eccezione non corrispondono. – Robaticus

+0

no, scusa, ho menzionato nella prima risposta, intendevo sostituire l'azione e il controller in entrambi, ma ho saltato la seconda occorrenza. Entrambi corrispondono. –

+0

Non capisco perché andrebbe bene su GET e lancia un errore su POST –

risposta

1

Tu dici:

HTTP verbo POST usato per accedere al percorso '/ object/edit/-2' non è permesso.

Tuttavia gli stati di eccezione:

Il HTTP POST verbo utilizzato per accedere percorso '/ profile/editlink/-2' non è permesso.

Edit:

penso che questo potrebbe essere correlato al tuo problema.

Tuttavia non è come si afferma.

+0

sì scusa, ho copiato l'errore ma intendevo sostituire entrambi, ma ho saltato la seconda occorrenza, la mia cattiva. –

+3

Puoi [modificare] per trasformare questo in una risposta invece di una domanda? – Will

0

provare a rimuovere

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 

e vedere se funziona proprio (di solito si dovrebbe mettere [HttpPost] di negare HttpGet ecc).

+0

hai ragione, anche se ho appena aggiunto questa dichiarazione a scopo di test. –

1

Consiglio vivamente di installare il debugger di routing trovato here. Ti mostrerà esattamente come viene analizzato un dato URL da ogni percorso, in modo che tu possa vedere cosa sta realmente accadendo quando colpisci quell'URL. Se il tuo percorso viene saltato, sai che il tuo vincolo funziona e puoi concentrarti su qualunque cosa lo stia catturando. Se il tuo percorso viene colpito, allora è un problema con l'azione e/oi verbi che prende.

Nota a margine: non sono riuscito a far funzionare correttamente la versione 2.0.0.7 di questo debugger (ad agosto), ma quello collegato direttamente nell'articolo (o la versione 1.0.0.1 su NuGet) funzionava correttamente. Suppongo che la versione corrente di NuGet funzioni, ma in caso contrario, prova la versione precedente.

+0

lo proveremo grazie. –

Problemi correlati