【问题标题】:Preserving default controller name in url in MVC5在 MVC5 的 url 中保留默认控制器名称
【发布时间】:2018-04-26 22:53:33
【问题描述】:

作为 FormExtensions.BeginForm() 方法的用户,我遇到了 UrlHelper.GenerateUrl() 方法的不令人满意的行为。

有标准路由:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

以下方法调用返回“/”

 //Request.RawUrl == "/Home"
 UrlHelper.GenerateUrl(
            routeName: null,
            actionName: null,
            controllerName: null,
            routeValues: null,
            routeCollection: RouteTable.Routes,
            requestContext: Request.RequestContext,
            includeImplicitMvcValues: true
         );

但是,如果 Home 控制器未在路由中设置为默认值,则上述方法调用会返回“/Home”,这是我想要的行为。

设置方法参数 actionName = "Index" 和 controllerName = "Home" 没有帮助。

我应该怎么做才能获得包含控制器名称的 url? ("/首页")

【问题讨论】:

  • 只需从默认值中删除controller = "Home"
  • 重点是同时作为默认使用
  • 然后你总是可以用url: "Home/{action}/{id}",创建一个新的路由定义(在默认之前)
  • @StephenMuecke 它有效,非常感谢:) 我刚刚添加了默认控制器和操作。如果需要,请将其发布为答案。完整的路由定义:routes.MapRoute(name: "Home", url: "Home/{action}/{id}", 默认值:new { controller = "Home", action = "Index", id = UrlParameter.Optional } );

标签: asp.net-mvc asp.net-mvc-5 asp.net-core-mvc


【解决方案1】:

您可以在默认路由之前添加额外的路由定义

routes.MapRoute(
    name: "Home",
    url: "Home/{action},
    defaults: new { controller = "Home", action = "Index" }
);
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

请注意,可选的 {id} 段不是必需的,因为如果提供了它,那么控制器和操作名称将包含在 url 中。

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    相关资源
    最近更新 更多