【问题标题】:How do you add data from the database to the shared _Layout.cshtml in ASP.NET Core MVC (.NET 6) application?如何将数据库中的数据添加到 ASP.NET Core MVC (.NET 6) 应用程序中的共享 _Layout.cshtml?
【发布时间】:2022-02-17 09:07:27
【问题描述】:

NET 大师们,我快疯了。我已经尝试了 3 天,但似乎没有任何效果。我创建了一个局部视图,一个基本控制器,尝试了不同的功能。我找到的每个解决方案都已过时。

现在有谁知道如何在 ASP.NET Core .NET 6、带有 Razor 页面的 MVC 中做到这一点?我找不到正确的文档。

我的 _Layout.cshtml 中有一个菜单,并希望在那里显示数据库中的类别,但模型始终为 NULL。我在不同的视图中显示数据没有问题,我似乎无法将模型添加到 _Layout.cshtml。

【问题讨论】:

  • 在剃须刀页面中,您仍然可以使用局部视图。

标签: c# model asp.net-core-mvc


【解决方案1】:

您可以尝试使用View Component 来呈现类别。

例如,我们可以参考以下步骤在MVC应用布局页面中显示类别:

  1. 创建名为 ViewComponents 的新文件夹。在此文件夹中,创建名为 CategoryViewComponent.cs 的新类,如下所示:

    using Microsoft.AspNetCore.Mvc;
    using WebApplication1.Data;
    
    namespace WebApplication1.ViewComponents
    {
        [ViewComponent(Name ="Category")]
        public class CategoryViewComponent:ViewComponent
        {
            private readonly ApplicationDbContext _context;
            public CategoryViewComponent(ApplicationDbContext applicationDbContext)
            {
                _context = applicationDbContext;
            }
    
            public async Task<IViewComponentResult> InvokeAsync()
            {
                return View("Index", _context.Categories.ToList());
            }
        }
    }
    
  2. 在 Views 文件夹中,使用路径 Views\Shared\Components\Category 创建新文件夹。在 Category 文件夹中,创建名为 Index.cshtml 的新文件夹:

    @model List<WebApplication1.Data.Category>
    
    <h2>Category</h2>
    
    <ul>
        @foreach(var item in Model)
        {
            <li>@item.CategoryName</li>
        }
    </ul>
    
  3. 在_Layout.cshtml页面中调用视图组件:

    <div class="container">
        <main role="main" class="pb-3">
            @await Component.InvokeAsync("Category")
            @RenderBody()
        </main>
    </div>
    

文件结构如下:

那么,结果是这样的:

如果使用 Razor 页面应用程序,请使用相同的代码和文件结构,如下所示:

那么,结果是这样的:

更多详细信息,也可以参考View Components in Razor Pages

【讨论】:

    【解决方案2】:

    布局视图可以有一个类型化的模型。对于剃须刀页面,我将介绍一个基本页面模型;

    interface IViewTemplate{
        IEnumerable<string> GetCategories();
    }
    public abstract class BasePageModel : PageModel, IViewTemplate{
        ...
    }
    public class MyPageModel : BasePageModel
        ...
    }
    

    那么你的视图就可以了;

    @model IViewTemplate
    
    @foreach(var category in Model.GetCategories()){
        ...
    }
    

    【讨论】:

    • 非常感谢您的回答!...但是由于 MVC 中不再有 BasePage,那不应该是控制器的工作吗?我弄错了吗?
    • 页面浏览量确实有一个BasePage,您可以用@inherits ... 覆盖它。但我说的是页面模型(例如@model IndexModel ... class IndexModel : ...)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2021-10-09
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多