2015-09-29 14 views
6

Ho un metodo di azione di controllo che funziona quando sembra che questo:ASP MVC azione di controllo '404 non trovato' errore quando decorato con [HttpPost]

public ActionResult testMethod(int id) 
{ 
    //do something... 
    //return something... 
    return View(); 
} 

Ma quando ho specificare che dovrebbe essere una " metodo post", ottengo un '404 non trovato errore':

[HttpPost] 
public ActionResult testMethod(int id) 
{ 
    //do something... 
    //return something... 
    return View(); 
} 

ho altri metodi di azione del controller nello stesso regolatore - sia pOST e GET, e funzionano bene. Ma questo no? Cosa sta succedendo? (Sono sicuro che mi manca qualcosa di ovvio qui ...)

Aggiornamento: Una chiamata ajax richiede il metodo controller: var id = 1;

$.ajax({ 
    url: '/indices/testMethod/', 
    data: id, 
    type: 'POST', 
    success: function (data) { 
     //Do something 
    } 
}); 

Ho anche provato a testare il metodo con Postman, assicurandomi che venga inviata una richiesta POST.

Aggiornamento 2: Ho provato a cambiare il parametro in id e ho cercato di assicurarmi che tutte le posizioni di metodo e URL fossero in maiuscolo per corrispondere, ma senza alcun effetto.

In Fiddler, vedo che in realtà viene effettuata una richiesta GET, anche se si specifica una richiesta POST nella chiamata ajax, quindi ora ho bisogno di scoprire perché la richiesta finisce per essere inviata come GET invece di un post.

Ho provato anche inclusa una descrizione del percorso di attributo, come questo

[HttpPost] 
    [Route("indices/TestMethod/{id:int}")] 
    public ActionResult TestMethod(int id) 

E poi provato la chiamata AJAX con un diverso URL:

$.ajax({ 
    url: '/indices/TestMethod/1', 
    data: id, 
    type: 'POST', 
    success: function (data) { 
     var tr = 123; 
     var yr = data; 
     //Do something 
    } 
}); 

Con attributo routing, e il valore paramter in l'URL, vedo in Fiddler che per prima cosa accade una richiesta POST, che ottiene un errore di stato 301, ma poi viene fatta anche una richiesta GET, che ottiene l'errore 404.

Update 3: Dopo altre indagini ho ristretto la definizione del problema sufficientemente che aveva un senso per aprire una nuova domanda, che può essere trovato qui: ASP MVC jQuery $.ajax POST request does not call controller method, but works in "fresh" MVC project

Il problema sembra essere causato dalla politica di sicurezza contenuti impostazioni che erano attive per questo progetto.

+0

come si tenta di contattare questa azione? – Robert

+4

Sei sicuro che la richiesta è POST'ing all'azione, non qualche altro verbo? Installa Fiddler ed esamina i dati della richiesta. – asawyer

+0

hanno aggiunto alcune informazioni aggiuntive - per quanto ne so, viene inviata una richiesta POST, ma non raggiunge mai il controller quando ottengo un errore 404. –

risposta

0

Potrebbe essere necessario aggiungere lo -attributo al parametro int param1 in quanto è un tipo semplice? Vedi here per maggiori informazioni.

In caso contrario è previsto un percorso nel formato /indices/testMethod/{param1} (vale a dire che il parametro deve essere nell'URL, anche se è una richiesta POST). Questo percorso potrebbe non essere definito, ad esempio nel tuo global.asax.cs. Ad esempio, potresti provare a fare una richiesta POST a /indices/testMethod/1. Solo per provare se è davvero un problema di routing?

In caso di problemi con il routing, è possibile definire un percorso specifico per il metodo utilizzando Attribute Routing. Almeno per test/sviluppo in quanto ciò rende più facile vedere/capire quale percorso è effettivamente definito per il tuo metodo.

Alcune domande addizionali per restringere giù, quello che potrebbe effettivamente essere:

  • quale formato fa si dataGoesHere -Oggetto hai?
  • Quali sono i metodi POST che funzionano? Quale tipo di dati è il loro parametro? Riferimento o tipo di valore?
  • Quali percorsi si registra (vale a dire nel global.asax.cs)?

Aggiornamento

vorrei provare seguente:

Definire il metodo di controllo in questo modo:

[HttpPost] 
[Route("indices/TestMethod/")] 
public ActionResult TestMethod([FromBody] int id) 

Definire invito all'azione come questo:

$.ajax({ 
    url: '/indices/TestMethod/', 
    data: id, // alternatively try: {id: id} 
    type: 'POST', 
    success: function (data) { } 
}); 

O prova a passare il valore id come valore semplice o prova a passarlo con un oggetto con una proprietà id (vedi commento sopra).

+1

In questo caso, il parametro sarebbe vuoto (null se riferimento, 0 se int). L'OP non può chiamare l'azione * affatto.Non si tratta di un parametro mancante –

+0

@PanagiotisKanavos: come sappiamo con quale URL l'autore sta provando i diversi scenari che sta menzionando? E come facciamo a sapere quali percorsi sono effettivamente definiti? Se 'param1' non è' UrlParameter.Optional', allora suppongo che il percorso per il metodo non corrisponda quando viene chiamato '/ indices/testMethod /' (senza ulteriori parametri). – PzYon

+0

@PzYon: la risposta è corretta, [FromBody] è una parte essenziale dell'identificazione del metodo. –

0

Provare a cambiare param1 a id e vedere se funziona. Questo può sembrare stupido, ma in realtà ho vissuto il problema prima di me stesso e questo ha risolto il problema.

L'altro problema che posso pensare è che nella tua app, il percorso testMethod è /Indices/TestMethod con caratteri maiuscoli. E quando richiedi /indices/testMethod/ potrebbe esserci qualche evento di reindirizzamento che si traduce in una richiesta GET.

Provare a cambiare il numero url nella chiamata ajax o provare ad aggiungere un attributo [Route()] per impostare il nome del percorso.

Problemi correlati