我有一些javascript尝试POST到名为Tables的控制器中的ActionResult。由于某种原因,路由无法正常工作。
我的Javascript(在我的视图顶部的脚本标记中):
$(document).ready(function () {
$('#somevalue').autocomplete({
source: '@Url.Action("Tables/GetExpenseTypes")'
});
})
我的控制器:
public class TablesController : Controller
{
public ActionResult GetExpenseTypes(string term)
{
return Json(Blah);
}
}
每当我执行调用时,它都会返回404 Not Found错误。当我查看请求时,它看起来像这样:
http://localhost:56569/Home/Tables/GetExpenseTypes
如果重要,这是我的RouteConfig.cs:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id =
UrlParameter.Optional }
);
为什么我的请求想要去家庭控制器,不管是什么?如果我在控制器/ Action之前加上正斜杠:
$('#somevalue').autocomplete({
source: '@Url.Action("/Tables/GetExpenseTypes")'
});
没有区别,请求仍然路由到Home控制器
答案 0 :(得分:1)
因为您错误地使用了Url.Action
助手
您当前的代码正在调用this overload
public virtual string Action(
string actionName
)
您正在传递Tables/GetExpenseTypes
作为actionName
参数的值。在构建此操作方法的URL时,辅助方法将使用当前控制器作为控制器,因此您将获得/Home/Tables/GetExpenseTypes
您应该使用this overload
public virtual string Action(
string actionName,
string controllerName
)
您将操作名称和控制器名称作为单独的参数传递
source: '@Url.Action("GetExpenseTypes","Tables")'
这将生成正确的网址。