0

MvcコントローラーとApiコントローラーの両方を含むMvc3プロジェクトがあります。「コントローラー/アクション」を指定せずにアプリケーションを実行すると、「デフォルト」ルートが選択され、「ホーム/インデックス」ページが表示されます。そのページが実行されると、URL: " api / controller "を使用してAjax呼び出しが行われ、jsonが返されます。これは、ページのテーブルにデータを入力するために使用されます。

 <script type="text/javascript">
     $(function () {
         var $products = $("#products");
         $.ajax({
             url: "api/products",
             contentType: "json",
             success: function (data) {
                 $.each(data, function (index, item) {
                     $products.append("<tr><td>" + item.ProductCode + "</td>" +
                                         "<td>" + item.Description + "</td>");
                 });
             }
         });
     });
 </script>

ただし、「localhost / home /index」のように「controller/action」を指定して同じページにリクエストを送信すると、Ajax呼び出しは「/ home / api / controller」に変換され、もちろんリクエストを完了できません。または、ApiControllerが見つからないため、結果を返します。

    public static void RegisterRoutes(RouteCollection routes) {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapHttpRoute(
           "DefaultApi",
           "api/{controller}/{id}",
           new { id = RouteParameter.Optional }
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
        );
    }

ルーティングの問題である必要があることを考慮して、ルートを追加することでこれを解決しました。

        routes.MapHttpRoute(
           "HomeApi",
           "home/api/{controller}/{id}",
           new { id = RouteParameter.Optional }
        );

これは成功しました。私の次の変更は次のとおりです。

        routes.MapHttpRoute(
           "AnyApi",
           "{folder}/api/{controller}/{id}",
           new { id = RouteParameter.Optional }
        );

これも機能しますが、WebApiとMvcの組み合わせを処理する正しい方法であるかどうかについては少し懐疑的です。

これはこれを処理する正しい方法ですか?または、より良い選択肢はありますか?

4

2 に答える 2

1

ルーティングの問題である必要があることを考慮して、ルートを追加することでこれを解決しました。

いいえ、それはルーティングの問題ではありません。あなたのルートは完全に素晴らしいです:

public static void RegisterRoutes(RouteCollection routes) {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapHttpRoute(
       "DefaultApi",
       "api/{controller}/{id}",
       new { id = RouteParameter.Optional }
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    );
}

問題は、URLヘルパーを使用してURLを生成するのではなく、JavaScriptにURLをハードコーディングしたことに起因します。ASP.NETMVCアプリケーション内にURLをハードコーディングしないでください。常にURLヘルパーを使用する必要があります。

それで:

<script type="text/javascript">
    $(function () {
        var $products = $("#products");
        var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "products" })';
        $.ajax({
            url: url,
            success: function (data) {
                $.each(data, function (index, item) {
                    $products.append("<tr><td>" + item.ProductCode + "</td>" +
                                         "<td>" + item.Description + "</td>");
                });
            }
        });
    });
</script>

またcontentType: 'json'、最初に正しいコンテンツタイプがcontentType: 'application/json'あり、次にこの場合はリクエストでデータを送信していないため、AJAX呼び出しからを削除したことに注意してください。したがって、に設定しないでくださいapplication/json

于 2012-08-24T06:11:34.207 に答える
0

そこにルートを追加する必要はありません。APIURLを指定して、常に機能するようにすることができます。

/api/controller

場合によっては、Url.RouteUrlヘルパーを使用して、ルートに基づいて(ルート名やルート値によって)明示的にURLを作成する必要があります。たとえば、これは「DefaultApi」という名前のルートをcontroller=productsで指定します。

@Url.RouteUrl("DefaultApi", new { controller = "products" })
于 2012-08-24T06:10:08.237 に答える