2012-09-02 12 views
43

Ho fatto qualche domanda precedente per chiedere l'aiuto con i problemi da quando ho aggiornato MVC4 webapi beta in RC. Ora mi sono impegnato di più, ma ecco uno che non riesco ancora a capire.Il controller semplice che accetta POST non viene trovato

Per questo semplice controller ne ho uno che accetta un POST e uno che accetta GET. Quando provo a eseguire quelli inviando richiesta da un modulo HTML, viene trovato solo il controller GET mentre il POST mi restituirà il seguente errore.

{ 
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost/webapi/api/play/test'.", 
    "MessageDetail": "No action was found on the controller 'Play' that matches the name 'test'." 
} 

Perché il controller POST non è stato trovato?

Controller

public class PlayController : ApiController 
{ 
    [HttpPost] // not found 
    public string Test(string output) 
    { 
     return output; 
    } 

    [HttpGet] // works 
    public string Test2(string output) 
    { 
     return output; 
    } 
} 

modulo HTML

<form action="http://localhost/webapi/api/play/test" method="post"> 
<input type="text" name="output" /> 
<input type="submit" name="submit" /> 
</form> 

<form action="http://localhost/webapi/api/play/test2" method="get"> 
<input type="text" name="output" /> 
<input type="submit" name="submit" /> 
</form> 

risposta

87

Web.API è un po 'esigente quando si desidera inviare i valori "semplici".

È necessario utilizzare l'attributo [FromBody] per segnalare che il valore non è venuta dal URL, ma dai dati pubblicato:

[HttpPost] 
public string Test([FromBody] string output) 
{ 
    return output; 
} 

Con questa modifica non sarà possibile ottenere più 404 ma output sarà sempre null, perché Web.Api requries valori iscritti in special format (cercare la sezione tipi semplici Invio):

in secondo luogo, il cliente deve inviare il valore con il seguente formato:

=value

In particolare, la parte nome della coppia nome/valore deve essere vuota per un tipo semplice. Non> tutti i browser supportano questo per moduli HTML, ma si creano questo formato nello script ...

Quindi consiglia che si dovrebbe creare un tipo di modello:

public class MyModel 
{ 
    public string Output { get; set; } 
} 

[HttpPost] 
public string Test(MyModel model) 
{ 
    return model.Output; 
} 

allora funzionerà con il tuo campiona da zero senza modificare le tue visualizzazioni.

+3

Se riesco a suonare in 3 anni dopo, grazie !! Questo ha risolto un problema su cui ho appena passato ore. Questo è esattamente ciò che SO è tutto. –

+0

Ho ricevuto lo stesso errore quando avevo una mancata corrispondenza del nome parametro tra webApiConfig.cs e la procedura nel controller. –

Problemi correlati