javascript - ASP.NET Core 使用 ViewComponent 跟踪侧边栏的事件页面

标签 javascript c# html asp.net-core

这是我的侧边栏 View 组件的默认 View

                <li class="nav-header text-center pb-1 text-white"><strong>Menu de Navegação</strong></li>

                @foreach (var item in Model.Items)
                {
                    <li class="nav-item has-treeview">

                        <a href="@item.Url" class="nav-link custom-sidebar-link">
                            @Html.Raw(@item.Icon)
                            <p class="text-white">
                                @item.Nome
                                @if (item.SubItems != null)
                                {
                                    <i class="fas fa-angle-left right"></i>
                                }
                            </p>
                        </a>
                        @if (item.SubItems != null)
                        {
                            <ul class="nav nav-treeview">
                                @foreach (var subItem in item.SubItems)
                                {
                                    <li class="nav-item">
                                        <a href="@subItem.Url" class="nav-link">
                                            @Html.Raw(@subItem.Icon)
                                            <p>
                                                @subItem.Nome
                                            </p>
                                        </a>
                                    </li>
                                }
                            </ul>
                        }
                    </li>
                }
            </ul>
        </nav>

这是cs文件

public class SidebarAdminViewComponent : ViewComponent
{
    public IViewComponentResult Invoke()
    {
        var claims = Request.HttpContext.User.Claims;
        var role = claims.FirstOrDefault(c => c.Type == ClaimTypes.Role)?.Value; ;


        var Sidebar = new SidebarViewModel();

        Sidebar.Items = new List<SidebarItemViewModel>();

        Sidebar.Items.Add(new SidebarItemViewModel
        {
            Nome = "Home",
            Icon = "<i class='nav-icon fas fa-house'></i>",
            Url = Url.Page("/Account/Home/Index")
        });

        Sidebar.Items.Add(sidebarItem);



        return View(Sidebar);
    }
}

正如你所见,我的代码中没有任何内容来设置事件类。嗯,那是因为我现在已经用 javascript 处理了这个问题

$(function () {
    var url = window.location;

    // Adds active on inner anchor and treeview anchor and treeview menu-open state to li
    $('ul.nav a').filter(function () {
        return this.href == url;
    }).addClass('active').parent().parent().siblings().addClass('active').parent().addClass('menu-open');

});

我希望能够仅使用 C# 来完成此操作,但我不知道如何检测用户所在的当前页面。

最佳答案

您要做的是从 View 中获取当前页面名称,并在您拥有的循环内添加比较(全部在 View 内)

                <li class="nav-header text-center pb-1 text-white"><strong>Menu de Navegação</strong></li>

                @foreach (var item in Model.Items)
                {
                    @* here for the parent menu item*@
                    <li class=@(ViewContext.RouteData.Values["Controller"].ToString().ToLower() == item.Name.ToLower() ? "nav-item has-treeview active" : "nav-item has-treeview">

                        <a href="@item.Url" class="nav-link custom-sidebar-link">
                            @Html.Raw(@item.Icon)
                            <p class="text-white">
                                @item.Nome
                                @if (item.SubItems != null)
                                {
                                    <i class="fas fa-angle-left right"></i>
                                }
                            </p>
                        </a>
                        @if (item.SubItems != null)
                        {
                            <ul class="nav nav-treeview">
                                @foreach (var subItem in item.SubItems)
                                {
                                    @* here for the child menu item*@
                                    <li class=@(ViewContext.RouteData.Values["Action"].ToString().ToLower() == item.Url.Split('/').Last().ToLower() ? "nav-item active" : "nav-item">
                                        <a href="@subItem.Url" class="nav-link">
                                            @Html.Raw(@subItem.Icon)
                                            <p>
                                                @subItem.Nome
                                            </p>
                                        </a>
                                    </li>
                                }
                            </ul>
                        }
                    </li>
                }
            </ul>
        </nav>

我使用了 .ToString().ToLower() 因为我在发布之前进行了测试,您可能不需要它们

关于javascript - ASP.NET Core 使用 ViewComponent 跟踪侧边栏的事件页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57280811/

相关文章:

c# - 是否可以直接使用 Microsoft.Win32 命名空间中的 Win32Native 类?

javascript - jQuery/Javascript 似乎停止工作了?

javascript - 我可以根据 JavaScript 函数的结果更改我的 HTML 网格对象的类吗?

javascript - 如何将附加文本放入其容器内

javascript - 如何从嵌套数组中获取字段值?

javascript - 在 QML 中动态创建 ListModel

c# - 在 C# 函数中键入 'string' 作为参数

javascript - 单击 html 中的按钮后如何从 javascript 函数写入文件

javascript - 不用ajax读取geoJson

c# - 如何手动设置程序集版本