2012-04-06 18 views
9

Próbowałem dodać drugi metody POST do domyślnej klasy ValuesController który zaprowadzi parametr id i działania identyczne metody PUT, jak tak:ASP.NET Web API - Wiele metod POST na jednym kontrolerze?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net.Http; 
using System.Web.Http; 

namespace WebCalendar.Controllers { 
    public class ValuesController : ApiController { 
     // GET /values 
     public IEnumerable<string> Get()    { 
      return new string[] { "value1", "value2" }; 
     } 

     // GET /values/5 
     public string Get(int id) { 
      return "value"; 
     } 

     // POST /values 
     public void Post(string value) { 
     } 

     // POST /values/5 
     public void Post(int id, string value) { 
      Put(id, value); 
     } 

     // PUT /values/5 
     public void Put(int id, string value){ 
     } 

     // DELETE /values/5 
     public void Delete(int id) { 
     } 
    } 
} 

Problem jest, kiedy dodać ten drugi metoda pOST, za każdym razem robię żądania pOST, pojawia się błąd:

"No action was found on the controller 'values' that matches the request." 

Gdybym Wykomentuj jednej z metod (nie ma znaczenia, który z nich), pOST będzie współpracować z innym sposobem. Próbowałem zmienić nazwy metod, a nawet używać [HttpPost] na obu, ale nic nie zadziałało.

Jak mogę mieć więcej niż jedną metodę POST w jednym ApiControllerze?

EDIT

Oto jedyna droga, że ​​używam:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "{controller}/{id}", 
    defaults: new { controller = "values", id = RouteParameter.Optional } 
); 
+2

Czy możesz zamieścić swoje trasy? –

+0

Brak limitu liczby metod post na kontroler. Podejrzewam, że to problem z routingiem. – TGH

+0

Jaki jest adres URL, pod który dzwonisz, aby to się nie udało? Co się stanie, jeśli podasz ciąg zapytania dla wartości? Myślę, że problem polega na tym, że parametr musi być tam, aby routing działał, ponieważ nie jest oznaczony jako opcjonalny. –

Odpowiedz

7

Trzeba obejmują działania w trasie:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 
+0

Oznaczanie tego jako odpowiedzi (ponieważ działa) , ale to, czego nie rozumiem, to: dlaczego potrzebne są działania? Dwie oddzielne metody Get działają bez niego, więc dlaczego muszę go dodać do metod Post? – Isaac

+2

Jeśli usuniesz parametr wartości z pierwszego testu POST, będzie on działał bez jawnego określenia działania, ale nie będzie możliwe publikowanie żadnych danych. Możesz obsługiwać posty tylko za pomocą unikalnych identyfikatorów URI. –

+0

Działa z Get, ponieważ {id} jest opcjonalnym parametrem trasy. Więc wartości/uzyskać trasy do Get() i wartości/get/1 tras do Get (int). Naprawdę musisz zdefiniować ręcznie trasę. –

Powiązane problemy