_Layout 中的 Razor 组件 SelectList。馊主意?

RazorComponent SelectList in _Layout. Bad idea?

我有一个 ASP.NET 使用 razor 页面的核心网络应用程序。我想在所有页面上创建一个下拉列表来选择一个项目。理想情况下,这将从 DbContext 中的 table 填充。有问题的 table 包含几个字段,两个重要的字段是 Id (PK) 和 Name。然后我想以某种方式存储用户的项目选择,并让所有索引页面在填充索引时查看该值。它必须查看 Id 值,但我希望下拉列表显示名称。

我完全是个新手,我正在寻找有关如何操作的指导。我认为 RazorComponent 有意义,但我一点也不确定。

我已经在单个索引的基础上进行过滤,但我正在努力尝试在整个应用程序范围内获得该功能。

非常感谢任何建议,谢谢!

如果您使用的是 Razor Pages,我相信您可以使用 ViewComponents

视图组件是完全独立的对象,可为 Razor 视图呈现 HTML,并为您提供大量控制。

您可以像这样将服务注入视图组件:

public class ProjectsViewComponent : ViewComponent
{
    private readonly ProjectService projectService;

    public ProjectsViewComponent(ProjectService projectService)
    {
        this.projectService = projectService;
    }
    public async Task<IViewComponentResult> InvokeAsync()
    {
        return View("default", projectService.GetProjects());
    }
}

然后让视图组件将项目转发给组件

@model IEnumerable<SelectListItem>
<h3>Users</h3>
<form>
    <ll>
        <select class="form-control" asp-items="Model" multiple="true"></select>
    </ll>
    <button type="submit" asp-page="WhateverPageNeedToHandleIt">Update</button>
</form>

然后最后一步就是在您的 _layout.cs

中调用它
<div class="col-md-3">
    @await Component.InvokeAsync("Projects")
</div>

您还可以将列表从项目服务 class 转换为 select 项目列表,如下所示:

return projects.ConvertAll(p =>
            {
                return new SelectListItem()
                {
                    Text = p.ToString(),
                    Value = p.ToString(),
                    Selected = false
                };
            });

可以在此处找到很好的教程。 https://www.learnrazorpages.com/razor-pages/view-components