jQuery ajax - 调用各种MVC控制器动作

时间:2013-07-09 10:40:41

标签: asp.net-mvc jquery asp.net-web-api asp.net-mvc-routing

我有一个控制器(RequestsController)有几个动作(都是一个参数)

例如:

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

我从jQuery ajax调用了以下所有这些操作:

        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)

据我了解,无论与其他操作冲突的参数如何,您都可以拨打controller action。 那不是这样吗?

如何在不必为每个controller action指定唯一数量的参数的情况下调用每个 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 } ); }

修改

{{1}}
{{1}}

2 个答案:

答案 0 :(得分:0)

  

据我了解,无论与其他操作冲突的参数如何,您都可以调用控制器操作

不,这种理解是错误的。这只会让C#编译器开心,但在ASP.NET MVC中无效。您无法在同一个控制器上使用相同的名称执行2个具有相同名称的控制器操作,只需使用相同的HTTP谓词,无论他们采用何种参数。

答案 1 :(得分:0)

更改WebApiConfig.cs中的Register方法。

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

这将启用RPC样式路由。另外,改变你的jQuery调用,就像这样。 1234只是硬编码数据,它将绑定到passId参数。

$.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 }
);