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の組み合わせを処理する正しい方法であるかどうかについては少し懐疑的です。
これはこれを処理する正しい方法ですか?または、より良い選択肢はありますか?