Визуализация html условно на основе маршрута в Razor Pages - PullRequest
0 голосов
/ 05 февраля 2020

Допустим, у меня есть следующий файл Razor _Layout.cshtml. Как мне написать закомментированные условия при использовании ASP. NET Core 3+ и Razor Pages.

<ul class="navbar-nav">
    <li class="nav-item">
        <a class="nav-link" asp-page="/Index">Index</a>
    </li>

    @* If route starts with /a/, for example http://localhost/a/1.html and http://localhost/a/2/1.html *@
    <li class="nav-item">
        <a class="nav-link" asp-page="/a/Index">A</a>
    </li>

    @* If route starts with /b/, for example http://localhost/b/1.html and http://localhost/b/2/1.html *@
    <li class="nav-item">
        <a class="nav-link" asp-page="/b/Index">B</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" asp-page="/b/1/Index">B other</a>
    </li>
</ul>

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

В Razor Pages вы можете использовать ViewContext.RouteData.Values["page"], также в файле _Layout. Если URL, например, https://localhost:44359/Help/About, он выдаст /Help/About.

Используя ваш код:

@{
    string page = ViewContext.RouteData.Values["page"] as string; // Values[] produces objects, so cast is needed
}

<ul class="navbar-nav">
    <li class="nav-item">
        <a class="nav-link" asp-page="/Index">Index</a>
    </li>

    @if (page.StartsWith("/a/"))
    {
        <li class="nav-item">
            <a class="nav-link" asp-page="/a/Index">A</a>
        </li>
    }

    @if (page.StartsWith("/b/"))
    {
        <li class="nav-item">
            <a class="nav-link" asp-page="/b/Index">B</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" asp-page="/b/1/Index">B other</a>
        </li>
    }
</ul>
0 голосов
/ 05 февраля 2020

Вы можете создать Конвенцию Razor Pages, которая будет выполняться для всех Razor Pages в определенной папке. С этим соглашением вы можете установить фильтр действий (фильтр результатов) для добавления идентификатора к ViewData.

Фильтр:

class AddRouteIdentifierFilter : ResultFilterAttribute
{
    private readonly string identifier;

    public TestFilter(string identifier)
    {
        this.identifier = identifier;
    }

    public override void OnResultExecuting(ResultExecutingContext context)
    {
        base.OnResultExecuting(context);
        ((PageResult)context.Result).ViewData["route-identifier"] = identifier;
    }
}

Установка соглашения:

services.AddMvc().AddRazorPagesOptions(opt => 
    opt.Conventions.AddFolderApplicationModelConvention("/A", model =>
        model.Filters.Add(new AddRouteIdentifierFilter("a"));
    );
    opt.Conventions.AddFolderApplicationModelConvention("/B", model =>
        model.Filters.Add(new AddRouteIdentifierFilter("b"));
    );
);

Доступ к идентификатору в представлении Razor Page:

<h1>Identifier: @ViewData["route-identifier"]</h1>
...