2012-09-02 9 views
43

Zrobiłem kilka poprzednich pytań z prośbą o pomoc w problemach, od kiedy zaktualizowałem webapi beta MVC4 do RC. Teraz mam najwięcej, ale tutaj nie mogę znaleźć przyczyny.Prosty kontroler, który pobiera POST, nie został znaleziony.

Dla tego prostego kontrolera mam taki, który akceptuje POST i taki, który akceptuje GET. Kiedy próbuję uruchomić te, wysyłając żądanie z formularza HTML, znajduje się tylko kontroler GET, podczas gdy POST zwróci mi następujący błąd.

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

Dlaczego nie znaleziono sterownika POST?

Kontrolery

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

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

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

Odpowiedz

87

Web.API jest trochę wybredna jeśli chcesz pisać "proste" wartości.

trzeba użyć atrybutu [FromBody] aby zasygnalizować, że wartość ta nie pochodzi z adresu URL, ale z zamieszczonych danych:

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

Dzięki tej zmianie nie dostaniesz 404 już jednak output będzie zawsze null, ponieważ Web.Api requries zaksięgowanych wartości special format (poszukaj Przesyłanie sekcji typów prostych):

drugie, klient musi wysłać wartość z następującym formacie:

=value

W szczególności część nazwy pary nazwa/wartość musi być pusta dla prostego typu. Nie> wszystkie przeglądarki obsługują ten formularzy HTML, jednak utworzyć ten format w skrypcie ...

Więc polecam, że należy utworzyć typ modelu

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

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

Wtedy będzie współpracować z próbka z plików bez modyfikowania widoków.

+3

Jeśli mogę zadzwonić 3 lata później, dziękuję !! To rozwiązało problem, który spędziłem wiele godzin. Właśnie o to chodzi w SO. –

+0

Mam ten sam błąd, gdy miałem niezgodność nazwy parametru między webApiConfig.cs a procedurą w kontrolerze. –

Powiązane problemy