【问题标题】:Blazor template with menu across the top顶部有菜单的 Blazor 模板
【发布时间】:2020-02-02 17:02:13
【问题描述】:

我从 VS2019 模板创建了一个新的 blazor 应用程序,该模板将菜单作为侧边栏。我花了一大早上的时间试图像当前的 MVC 模板一样在页面顶部获取菜单,但完全没有得到任何地方!

有没有人有一个从侧面和顶部移除导航栏的 Blazor 模板?

【问题讨论】:

  • Blazor 使用 HTML 和 CSS。该菜单与 Angular(或任何 SPA)模板故意使用的菜单略有不同。水平菜单来自 Bootstrap ,它不是 MVC 特有的 - 它只是一个 bootstrap navbar。如果我没记错的话,Blazor 也使用引导程序。

标签: .net-core blazor


【解决方案1】:

Blazor 中的侧边栏并没有什么特别之处。如果您检查MainLayout.razor,您将看到对具有sidebar 类的NavMenu 组件的引用:

<div class="sidebar">
    <NavMenu />
</div>

如果您打开NavMenu.razor,您会发现它只是一个Bootstrap Navbar,方便地打包在一个可重复使用的组件中。

更新

Blazor 使用 Bootstrap 使其余问题成为样式表问题,而不是 Blazor 问题。

Blazor 模板的样式表是为这种类似于 Explorer 的特定布局而构建的 - 左侧是垂直导航栏,右侧是主要区域。颜色,尺寸,最重要的是流量,都是为此而设计的。修改一个样式类是不够的。

另一方面,Razor 页面 样式表是为“经典”引导程序外观而构建的,菜单在顶部,容器和行在中间,页脚和页眉。这意味着,我们可以从新的 Razor Pages 应用程序“借用”样式表和布局。

  1. 使用dotnet new webapp 创建一个新项目
  2. 删除 Blazor 的 site.css 中除第一行之外的所有内容:
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
  1. 将 Razor 的 site.css 的内容复制到 Blazor 的 site.css。该文件应如下所示:
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');

a.navbar-brand {
    white-space: normal;
    text-align: center;
    word-break: break-all;
  }
...
  1. 修改 Blazor 的 Shared\MainLayout.razor 以模仿 Razor 的 Shared\_Layout.cshtml 中的结构:
@inherits LayoutComponentBase


<header>
  <NavMenu />
</header>

<div class="container">
    <main role="main" class="pb-3">
        @Body
    </main>
</div>

这里没有页脚,因为 Blazor 模板中没有 Privacy 页面。

  1. 修改Shared\NavMenu.razor 以使用Razor 模板的结构和样式。 &lt;a&gt; 元素需要替换为 NavLink 元素。另一个棘手的部分是 Razor 中的切换器通过 data-toggle="collapse" data-target 属性工作,这在 Blazor 中不起作用。这就是需要点击处理程序的原因:
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
    <div class="container">
        <a class="navbar-brand" href="">blazornav</a>
        <button class="navbar-toggler" type="button" @onclick="ToggleNavMenu">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="@NavMenuCssClass"  @onclick="ToggleNavMenu">
            <ul class="navbar-nav flex-grow-1">
                <li class="nav-item">
                    <NavLink class="nav-link text-dark" href="" Match="NavLinkMatch.All">
                        <span class="oi oi-home" aria-hidden="true"></span> Home
                    </NavLink>                
                </li>
                <li class="nav-item">
                    <NavLink class="nav-link text-dark" href="counter">
                        <span class="oi oi-plus" aria-hidden="true"></span> Counter
                    </NavLink>
                </li>
                <li class="nav-item">
                    <NavLink class="nav-link text-dark" href="fetchdata">
                        <span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
                    </NavLink>
                </li>
            </ul>
        </div>
    </div>
</nav>

点击处理程序只是将collapse 类添加或删除到从 Razor 复制的基本导航栏样式

@code {
    bool collapseNavMenu = true;

    string baseMenuClass = "navbar-collapse d-sm-inline-flex flex-sm-row-reverse";

    string NavMenuCssClass => baseMenuClass + (collapseNavMenu ? " collapse" : "");

    void ToggleNavMenu()
    {
        collapseNavMenu = !collapseNavMenu;
    }
}

这会产生一个水平菜单,右侧有一个切换器:

【讨论】:

  • 这是真的,但是到目前为止,试图让侧边栏越过顶部被证明是不可能的
  • 此外,它不仅仅是“丢弃”引导程序 4 导航的情况,因为提供的当前模板与剃须刀组件集成。
  • @Calanus 真正的问题是整个网站的风格和布局。即使您从 NavMenu 内的导航栏中删除所有类,布局也会受到 main 内容的 maintoprows 样式类的影响。 site.css 中指定的布局用于垂直导航栏,其余用于内容。您应该从适合您的 站点的新样式表开始。只是为了试验,你可以清除 site.css 文件或复制现有的样式表
  • 再次尝试,放入 MVC 导航栏并替换 css。取得了进展,但没有一个链接是可点击的。 blazor 中还有其他事情正在影响它。
  • "删除 Blazor 的 site.css 中除第一行之外的所有内容:"我不能强调这一点,不要删除 main.css 中的所有内容,您必须保留 "#blazor-error-ui"和“#blazor-error-ui .dismiss”css 规则。如果您不保留这些,那么在您开发应用程序时,您将不会看到任何异常发生时的通知。如果使用服务器端 blazor,这还不错,因为 VS 调试器通常会中断,但在 WASM 模型中,除非维护错误 ui 样式,否则您不会在浏览器代码中看到异常。
【解决方案2】:

按照@Panagiotis Kanavos 的建议,我设法为顶部菜单栏创建了一个基本模板/解决方案:

BlazorTopMenu

【讨论】:

  • 最后 - 一个结构良好的工作示例。谢谢你的链接。我不知道为什么将菜单放在顶部是如此重要。
  • 正是我想要的。我有一个垂直的主导航栏,并使用您的示例在组件内创建了一个子菜单水平导航栏。删除了“固定顶”类,效果很好。谢谢。
  • 很好的例子,我认为这个答案应该被接受。
  • 我实际上使用了@Panagiotis Kanavos 的建议来创建 github 示例,所以他拥有 SO 点是唯一公平的。
  • 我在遇到同样的问题时遇到了这个答案 - 我很好奇你是否像 Pangiotis 所描述的那样使用 dotnet new webapp 开始这个问题?我试图重新创建相同但没有得到相同的结果..
【解决方案3】:

我使用 .NET 6 创建了一个工作示例,您可以在 https://github.com/martinmogusu/blazor-top-navbar 上查看它

最终的结果是这样的:

【讨论】:

  • 谢谢!你为我节省了一些时间:)
【解决方案4】:

我昨天刚刚经历了同样的事情。非常令人沮丧。我能够摆脱侧边栏并将菜单放在顶部。不幸的是,在我这样做之后,在小型设备中,当单击切换按钮后展开菜单时,品牌、切换按钮和菜单都垂直居中于展开区域,人们希望只出现菜单项。品牌和切换按钮应保留在第一行。

Expanded menu

今天早上,我看到一个帖子 (https://www.nativoplus.studio/blog/blazor-layouts/) 建议修改 Blazor 模板中包含的引导 css。要获得默认行为,您需要将它(和 site.css)从 _Host.cshtml 中注释掉,并将其替换为官方引导 css 文件。

当我这样做时,菜单开始几乎正常工作。奇怪的格式消失了。我现在的问题是,在小型设备上,选择菜单后,菜单不会折叠。我假设它与 Blazor 处理 UI 更改的方式有关。换句话说,由于菜单内容在做出选择后没有改变,所以它不会重新渲染菜单。

如果我想出折叠菜单的方法,我会在这里发布。

【讨论】:

  • 我很高兴不仅仅是我!我认为您可以使用标准模板中的剃须刀代码折叠菜单 - 我会在周末检查一下
【解决方案5】:

您可以删除 MainLayout.razor 中的大部分内容,只留下基本内容,并使用样式标签在 razor 页面中创建自己的 css 样式。

@inherits LayoutComponentBase

<PageTitle>Portfolio</PageTitle>

<div class="page">
    <main>
        @Body
    </main>
</div>

【讨论】:

  • 这里没有必要诋毁其他人的努力。我已经把它编辑掉了。毕竟我们都是志愿者,这是一个免费网站。如果您对此处任何人的帖子有任何批评(内容长度和可读性当然是有效的),欢迎您在获得足够声誉后发表礼貌评论,说明他们如何改进这些帖子。
【解决方案6】:

如果您是 2021 年的新手,只需更改 NavMenu.razor 中的标题,而不是仅在 MainLayout.razor 中!

【讨论】:

    猜你喜欢
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多