【问题标题】:Calling an ActionResult in a controller that isn't Home在非 Home 的控制器中调用 ActionResult
【发布时间】:2017-11-15 00:33:46
【问题描述】:

我有一些 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 }
);

为什么我的请求无论如何都想转到 Home 控制器?如果我在控制器/动作之前加上正斜杠:

$('#somevalue').autocomplete({
    source: '@Url.Action("/Tables/GetExpenseTypes")'
});

没什么区别,请求还是路由到 Home 控制器

【问题讨论】:

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


    【解决方案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")'
    

    这将生成正确的网址。

    【讨论】:

    • 工作就像一个魅力。谢谢@Shyju
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2020-07-06
    相关资源
    最近更新 更多