2012-09-02 17 views
43

He hecho algunas preguntas previas para pedir ayuda con los problemas desde que actualicé MVC4 webapi beta a RC. Tengo más en orden ahora, pero aquí hay uno que no puedo entender por qué.Controlador simple que toma POST no se encuentra

Para este controlador simple, tengo uno que acepta un POST y otro que acepta GET. Cuando intento ejecutarlos enviando una solicitud desde un formulario HTML, solo se encuentra el controlador GET mientras que el POST me devuelve el siguiente error.

{ 
    "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'." 
} 

¿Por qué no se encuentra el controlador POST?

controladores

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

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

formulario 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> 

Respuesta

87

Web.API es un poco exigente en lo que desea publicar los valores "simples".

Es necesario utilizar el atributo [FromBody] para señalar que el valor no está viniendo de la URL, pero a partir de los datos publicado:

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

Con este cambio no se va a 404 más, pero siempre habrá output nula, porque Web.Api requries los valores publicados en special format (busque la sección Envío de tipos simples):

en segundo lugar, el cliente debe enviar el valor con el siguiente formato:

=value

En concreto, la parte del nombre del par nombre/valor debe estar vacía para un tipo simple. No> todos los navegadores soportan esto para formularios HTML, pero que crean este formato en el guión ...

Así recomiendan que se debe crear un tipo de modelo:

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

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

después trabajará con su muestra froms sin modificar sus puntos de vista.

+3

Si puedo sonar tres años después, ¡¡¡Gracias !! Esto resolvió un problema que acabo de pasar horas. Esto es exactamente de lo que SO se trata. –

+0

Recibí el mismo error cuando tenía una discrepancia de nombre de parámetro entre webApiConfig.cs y el procedimiento en el controlador. –

Cuestiones relacionadas