在非Home的控制器中调用ActionResult

时间:2017-11-15 00:33:47

标签: c# ajax asp.net-mvc controller

我有一些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控制器

1 个答案:

答案 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")'

这将生成正确的网址。