Разумным решением является создание View Component , а затем добавление его в _Layout.cs html. Я нашел хорошее пошаговое руководство Питера Келлнера (Progress) , которое помогло мне на моем пути. По сути, мое решение включало:
- Создание папки на страницах под названием «Компоненты»
- Создание подпапки «Компоненты» под названием «TimeZoneControl»
- Добавление класса с именем 'TimeZoneControlViewComponent.cs' в 'TimeZoneControl'
- Добавление представления Razor с именем 'Default.cshtm' в 'TimeZoneControl'
- Изменение моего _Layout.cs html для включения моего компонента представления TimeZoneControl
- Добавление @ addTagHelper *, MyWebApp в конец _ViewImports.cs html, где MyWebApp - это имя моего проекта веб-приложения Visual Studio.
В терминах кода:
TimeZoneControlViewComponent.cs - ViewComponents поддерживают внедрение зависимостей, поэтому можно поместить код в конструктор для поддержки доступа к базе данных, как описано в Microsoft Docs
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
namespace C19QuarantineWebApp.Pages.Components.TimeZoneControl
{
public class TimeZoneControlViewComponent : ViewComponent
{
public TimeZoneControlViewComponent() { }
public IViewComponentResult Invoke(string timeZoneId)
{
var timeZones = new List<string>();
timeZones.AddRange(new[] {"GMT", "CET", "IST"});
return View("Default", timeZones.ToArray());
}
}
}
Default.cs html
@model string[]
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownTZ" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Time zones
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
@foreach(var tz in Model) {<a class="dropdown-item" href="#">@tz</a>}
</div>
_Layout.cs html - заменить исходный раскрывающийся список (см. Вопрос) на * 103 9 *
<vc:time-zone-control time-zone-id="xxx">
</vc:time-zone-control>
В контексте это дает:
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/About">About</a>
</li>
<li class="nav-item dropdown ml-auto">
<vc:time-zone-control time-zone-id="xxx">
</vc:time-zone-control>
</li>
</ul>
</div>
Мне было бы интересно получить комментарии по этому решению. Есть ли более простой и элегантный способ сделать это?