Как получить доступ к текущему маршруту с помощью компонента Blazor - PullRequest
0 голосов
/ 03 августа 2020

У меня есть веб-приложение ASP (точка) NET с простой панелью навигации. Я пытаюсь использовать компонент Blazor, который изменит панель навигации и увеличит ширину левой границы, если страница окажется активная страница. Пока я использую оператор switch, который будет переключаться в зависимости от текущей страницы, представленной строкой. Моя проблема в том, что я не могу найти способ программным образом найти текущий URL-адрес сайта. Я искал этот вопрос несколько раз, и каждое решение у меня не сработало, использование HttpContext тоже не сработало.

switch (CurrUrl)
{
case "Index":
    <header>
        <div>
            <nav>
                <ul class="main-menu">
                    <li id="CurPage">Home</li>
                    <li class="menu-item">Shop</li>
                    <li class="menu-item">FAQ</li>
                    <li class="menu-item">About</li>
                </ul>
            </nav>
        </div>
    </header>
    break;
case "Shop":
    <header>
        <div>
            <nav>
                <ul class="main-menu">
                    <li class="menu-item">Home</li>
                    <li id="CurPage">Shop</li>
                    <li class="menu-item">FAQ</li>
                    <li class="menu-item">About</li>
                </ul>
            </nav>
        </div>
    </header>
    break;
case "FAQ":
    <header>
        <div>
            <nav>
                <ul class="main-menu">
                    <li class="menu-item">Home</li>
                    <li Class="menu-item">Shop</li>
                    <li id="CurPage">FAQ</li>
                    <li class="menu-item">About</li>
                </ul>
            </nav>
        </div>
    </header>
    break;
case "About":
    <header>
        <div>
            <nav>
                <ul class="main-menu">
                    <li class="menu-item">Home</li>
                    <li class="menu-item">Shop</li>
                    <li class="menu-item">FAQ</li>
                    <li id="CurPage">About</li>
                </ul>
            </nav>
        </div>
    </header>
    break;
}

@code {
    string CurrUrl = null;
}

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Как получить доступ к текущему маршруту с помощью компонента Blazor

Этот заголовок вводит в заблуждение, и вы должны его изменить. Вы не можете получить доступ к текущему маршруту для выполнения этой задачи, поскольку текущий маршрут еще не существует

Я искал этот вопрос несколько раз, и каждое решение не сработало для меня, использование HttpContext также не сработало.

Опять же, решение не в использовании текущего маршрута, поскольку маршрут еще не был создан. Ваши компоненты еще не созданы, поэтому маршрут недоступен

HttpContext недоступен в Blazor, большую часть времени, если вообще ...

Решение:

Добавьте этот код в компонент MainLayout

  1. Определите свойство типа Type. Это свойство будет заполнено типом (компонентом), который будет создан

  2. Тип компонента можно получить из метода OnParametersSet компонента MainLayout

  3. Когда вы запускаете свой проект, типом является индекс (обратите внимание, что он возвращается в форме: <projectname>.Pages.Index)

  4. Если вы вводите в браузере URL-адрес вашего приложения + "/ counter", например: https://localhost:44373/counter, вы получите <projectname>.Pages.Counter

    @ code {

      public Type PageType { get; set; }
    
      protected override void OnParametersSet()
     {
    
        PageType = (this.Body.Target as RouteView)?.RouteData.PageType;
    
        Console.WriteLine("This is your type (current type)" + 
                                                       PageType);
     }
    

    }

В верхней части файла MainLayout.razor создается экземпляр <NavMenu />. Добавьте к нему параметр атрибута с именем PageType, как показано ниже:

<NavMenu PageType="@PageType" />

PageType слева должен быть определен в компоненте NavMenu. Как видите, он привязан к свойству PageType, определенному в MainLayout.

Теперь вы должны определить свойство параметра с именем PageType в NavMenu следующим образом:

NavMenu.razor

@code {
    [Parameter]
    public Type PageType { get; set; }
} 

Теперь у вас есть текущий Тип (компонент ), доступный в вашем компоненте NavMenu, и вы можете использовать его по своему усмотрению.

Важно, чтобы вы понимали, как компоненты визуализируются ... что идет первым, затем et c. И многое другое ...

Но, эй, вам будет сложно управлять своей задачей ... Следующий фрагмент кода очень грубо демонстрирует, что то, что вы собираетесь сделать, выполнимо (мой код отлично и выполняет свою работу, и проблемы, которые у вас могут возникнуть, не связаны с этим).

NavMenu.razor

<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
       
    @switch (PageType.ToString())
    {
        case "BlazorApp4.Pages.Index":
            @*<header>
                    <div>
                        <nav>
                            <ul class="main-menu">
                                <li id="CurPage">Home</li>
                                <li class="menu-item">Shop</li>
                                <li class="menu-item">FAQ</li>
                                <li class="menu-item">About</li>
                            </ul>
                        </nav>
                    </div>
                </header>*@

            <ul class="nav flex-column">
                <li class="nav-item px-3">
                    <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
                        <span class="oi oi-home" aria-hidden="true"></span> Home
                    </NavLink>
                </li>
                <li class="nav-item px-3">
                    <NavLink class="nav-link" href="counter">
                        <span class="oi oi-plus" aria-hidden="true"></span> Counter
                    </NavLink>
                </li>
                <li class="nav-item px-3">
                    <NavLink class="nav-link" href="fetchdata">
                        <span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
                    </NavLink>
                </li>
            </ul>
            break;
        case "Shop":
            <header>
                <div>
                    <nav>
                        <ul class="main-menu">
                            <li class="menu-item">Home</li>
                            <li id="CurPage">Shop</li>
                            <li class="menu-item">FAQ</li>
                            <li class="menu-item">About</li>
                        </ul>
                    </nav>
                </div>
            </header>
            break;
        case "FAQ":
            <header>
                <div>
                    <nav>
                        <ul class="main-menu">
                            <li class="menu-item">Home</li>
                            <li Class="menu-item">Shop</li>
                            <li id="CurPage">FAQ</li>
                            <li class="menu-item">About</li>
                        </ul>
                    </nav>
                </div>
            </header>
            break;
        case "About":
            <header>
                <div>
                    <nav>
                        <ul class="main-menu">
                            <li class="menu-item">Home</li>
                            <li class="menu-item">Shop</li>
                            <li class="menu-item">FAQ</li>
                            <li id="CurPage">About</li>
                        </ul>
                    </nav>
                </div>
            </header>
            break;
    }
</div>  

В приведенном выше коде будут отображаться ссылки по умолчанию на страницы шаблонов по умолчанию, когда вы запускаете свою страницу. (Индексная страница). Закомментируйте код в case "BlazorApp4.Pages.Index: и раскомментируйте свой код (...), расположенный в case "BlazorApp4.Pages.Index":

И вот, полная темнота ... вот и ваши усилия ... усердно работайте .. . удачи.

0 голосов
/ 03 августа 2020

Вы можете получить текущий URL из диспетчера навигации.

@page "/navigate"
@inject NavigationManager NavigationManager

@code {
   string CurrUrl = null;
   protected override void OnInitialized()
   {
       CurrUrl = NavigationManager.Uri.ToString();
   }
}

Docs

...