Как использовать значения окружающего маршрута в ASP. NET Core 3 Razor Pages? - PullRequest
1 голос
/ 16 марта 2020

Используя ASP. NET Core 3 Razor Pages, предположим, что вы хотите настроить страницы со следующей структурой URL:

http://contoso.com/course/4231/details
http://contoso.com/course/4231/students

, где 4231 - идентификатор курса. Это может быть достигнуто с помощью директивы @page:

@page "/course/{courseId}/details"

Теперь предположим, что вы хотите создать ссылки между страницами /details и /students. Затем вы хотите, чтобы параметр courseId был добавлен к каждой ссылке, что может быть выполнено с помощью помощника тега привязки следующим образом:

<a asp-page="./students" asp-route-courseid="@RouteData.Values["courseId"]>Students</a>

Насколько я понял, в ASP. NET Core 2.1 и более ранние версии не было необходимости добавлять атрибут asp-route-* для этой цели, потому что значения маршрута будут «распространяться» на другие страницы, автоматически добавляясь к любому тегу привязки, если не будет переопределено вручную («значения окружающего маршрута») как это называлось). Это, по-видимому, было удалено в версии 2.2, но я не совсем уверен, почему.

Необходимость всегда помнить о том, что нужно вручную распространять значения маршрутов с использованием вышеуказанной схемы, кажется очень подверженным ошибкам рабочим процессом и может выйти из Быстро, если у вас есть много значений маршрута, которые всегда нужно добавлять в теги привязки.

Можно ли вручную включить значения окружающего маршрута в более поздних версиях ASP. NET Core, как минимум по индивидуальным параметрам? Есть ли причина не делать этого?

По сути, я бы хотел, чтобы помощники тегов привязки были относительными, так что простая ссылка на ./students из /course/4231/details автоматически преобразуется в /course/4231/details.

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Поскольку мне удалось найти решение для этого, я собираюсь ответить на свой собственный вопрос.

Как уже упоминалось в этом выпуске GitHub (благодарность Оливеру Вейххолду), вы можете переопределите стандартный помощник тега привязки (и помощник тега действия формы), чтобы добиться желаемого поведения автоматического добавления значений маршрута в ссылки.

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

public override void Process(TagHelperContext context, TagHelperOutput output)
{
    var routeTemplate = ViewContext.ActionDescriptor.AttributeRouteInfo.Template;

    Regex regex = new Regex(@"\{(\w+)(:.+)?\??\}");
    var matches = regex.Matches(routeTemplate);

    if (matches.Count > 0)
        foreach (var routeValueKvp in ViewContext.HttpContext.Request.RouteValues)
            if (matches.Any(x => x.Groups[1].Value == routeValueKvp.Key))
                RouteValues[routeValueKvp.Key] = routeValueKvp.Value.ToString();

    base.Process(context, output);
}

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

0 голосов
/ 16 марта 2020

ИМО, ожидается. При перенаправлении на одно и то же действие / страницу текущие значения окружающего маршрута используются повторно.

<a asp-page="details">Studentdetails</a>

Генерирует URL: /course/4231/details.

Когда вы перенаправляете на другое действие / страница, окружающие значения правильно игнорируются.

<a asp-page="./students">Students</a>

не будет генерировать правильный URL.

См. https://github.com/dotnet/aspnetcore/issues/3746

...