【问题标题】:How to hide “Area” name in URL?如何在 URL 中隐藏“区域”名称?
【发布时间】:2018-04-26 19:15:14
【问题描述】:

我的问题是,当我不在“管理”区域时,链接显示为“/blog”,但是当我在“管理”区域时,链接变为“/管理员/博客”。

我有一个“管理”区域,并且我在“管理”区域视图部分的 viewstart 文件中指定了一个布局页面。标记如下:

 Layout = "~/Views/Shared/_Layout.cshtml";

我的链接的标记看起来像这样(这个链接在我的 _Layout.cshtml 视图中):

 <a asp-controller="Blog" asp-action="Index" class="nav-link"> Blog </a>

我的路线如下所示:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "areas",
        template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
    );
});

我的“管理”区域中的控制器如下所示:

[Authorize(Roles = "Admin")]
[Area("Admin")]
public class ProductsController : Controller

我已经尝试添加 asp-area="" 所以我的 a 标签看起来像:

<a asp-area="" asp-controller="Blog" asp-action="Index" class="nav-link"> Blog </a>

但是当通过开发者工具查看它时,这只会让 href 为空。

所以我的问题是如何从 url 中删除区域名称?

我觉得这很容易,但我无法弄清楚。我查看了 this 线程,但它不在 .net 核心中,因此该解决方案不起作用。

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    您的问题可能与您的路线定义有关。尝试将这些路由组合成一个 UseMvc 调用,并首先放置更具体的区域路由。

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "areas",
            template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
    
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
    

    之后,您可以将标签切换为使用asp-route="default",而不是使用asp-controller="..." 和asp-action="..."。

    【讨论】:

    • 哇,我不敢相信我没有尝试过。我不得不将您的解决方案与将 asp-area="" 添加到 a 标签结合使用,并且它起作用了。谢谢一千!
    • 没问题,我很高兴它成功了。对于它的价值,我建议使用 asp-route="default" 命名路由方法,因为您正在有效地尝试定位特定的 default 路由。如果这样做,您似乎还需要指定 asp-route-controller="..." 和 asp-route-action="..."。
    • @MattBrooks 不起作用。如果我使用asp-route="default",它总是只加载主页。
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2017-05-06
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多