0

RequestsControllerいくつかのアクションを持つコントローラー ( ) があります (すべて 1 つのパラメーターを取ります)

例えば:

  • 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

他のアクションと競合するパラメーターに関係なく、コントローラーアクションを呼び出すことができることは私の理解です

いいえ、この理解は間違っています。これは C# コンパイラを満足させるだけですが、ASP.NET MVC では無効です。同じコントローラ上に同じ名前の 2 つのコントローラ アクションを、同じ HTTP 動詞でアクセスできるようにすることはできません。それらが取るパラメータに関係ありません。

于 2013-07-09T13:43:35.200 に答える
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 に答える