2013-07-09 9 views
0

У меня есть контроллер (RequestsController) с несколькими действиями (все принимает один параметр)JQuery Ajax - вызвать различные MVC действия контроллера

Например:

  • public List<Models.AcceptRequests> GetAllAcceptRequests(int passedId)
  • public List<Models.Requests> GetAllRequests(int passedId)
  • public List<Models.CancelRequests> GetAllCancelRequests(int passedId)

Я c Alling каждого из этих действий от jQueryajax следующим образом:

 var s = 
     { 
      passedId: 0, 
     } 
     $.ajax({ 
      url: "../api/Requests/GetAllAcceptRequests", 
      type: "GET", 
      dataType: 'json', 
      data: JSON.stringify(s), 
      contentType: "application/json; charset=utf-8", 
      success: function (response) { 
       vm.Requests(ko.utils.unwrapObservable(ko.mapping.fromJS(response))); 
      } 
     }); 

Я получаю следующее сообщение об ошибке:

Multiple actions were found that match the request: System.Collections.Generic.List1 [TCMSWeb.Models.Requests] GetAllRequests(Int32)

Это мое понимание того, что вы можете позвонить в controlleraction независимо от параметров противоречащих другие действия. Разве это не так?

Как я могу назвать каждый controlleraction без указания уникального количества параметров для каждого?

EDIT:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
 routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
+0

Можете ли вы показать конфигурации маршрутизации? – Stijn

ответ

0

Измените метод Register в WebApiConfig.cs следующим образом.

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

Это позволит маршрутизировать стиль RPC. Кроме того, измените ваш вызов jQuery, вот так. 1234 - это только жестко кодированные данные, которые будут связаны с переданным параметром.

$.ajax({ 
     url: "../api/Requests/GetAllAcceptRequests?passedid=1234", 
     type: "GET", 
     dataType: 'json', 
     success: function (response) { 
      vm.Requests(ko.utils.unwrapObservable(ko.mapping.fromJS(response))); 
     } 
    }); 

Вы можете также использовать url: "../api/Requests/GetAllAcceptRequests/1234", если изменить отображение маршрута на

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

It is my understanding that you can call a controller action regardless of the parameters conflicting with other actions

Нет, это понимание является неправильным. Это делает компилятор C# счастливым, но недействительным в ASP.NET MVC. У вас не может быть двух действий с одним и тем же именем на одном и том же контроллере, доступном с тем же HTTP-глаголом, независимо от параметров, которые они принимают.

+0

У них нет одинакового имени. – Stijn

+0

@Stijn, откуда вы это знаете? –

+0

Потому что это наверху его вопроса? Если реальные действия не имеют одинакового имени, а его примеры - это просто примеры: примеры. – Stijn

Смежные вопросы