Ответ заключается в использовании ViewData со страницы для передачи данных в макет и его подэлементы.
На странице
@page
@{
ViewData["ActiveIndex"] = 2;
ViewData["Title"] = "Books";
ViewData["Description"] = "";
ViewData["Keywords"] = "";
}
В макете я затем отображаю заголовоккак это
<partial name="_Header" model='new _HeaderModel((int?)ViewData["ActiveIndex"])' />
Тогда заголовок может иметь строго типизированный параметр как часть своей модели и извлекать его из конструктора.
public class _HeaderModel : PageModel {
public int? ActiveIndex { get; set; }
public _HeaderModel() { }
public _HeaderModel(int? activeIndex) {
this.ActiveIndex = activeIndex;
}
}
Добавлен вспомогательный метод
HtmlString ActiveTag(int index) => new HtmlString(index == ActiveIndex ? @"class=""active""" : "");
Тогда эта старая строка
<li <%= ActiveIndex == 0 ? "class=\"active\"" : "" %>
превращается в
<li @ActiveTag(0)>
Реорганизация WebForms в Razor Pages требует немного работы, но всегда приводит к гораздо меньшему количеству кода:)