0

我有一个控制器 ( 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无论参数与其他操作是否冲突,您都可以调用 a 。不是这样吗?

如何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 }
        );
    }
4

2 回答 2

0

像这样更改 WebApiConfig.cs 中的 Register 方法。

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

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

$.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 }
);
于 2013-07-09T14:08:28.063 回答
0

我的理解是,无论参数与其他操作是否冲突,您都可以调用控制器操作

不,这种理解是错误的。这只会让 C# 编译器满意,但在 ASP.NET MVC 中无效。您不能在同一个控制器上使用相同的 HTTP 谓词访问具有相同名称的 2 个控制器操作,无论它们采用什么参数。

于 2013-07-09T13:43:35.200 回答