我有一个包含 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>
但是,当向指定“controller/action”的同一页面发出请求时,如“ localhost/home/index ”,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 结合的正确方法。
这是处理这个问题的正确方法吗?还是有更好的选择?