如何在 ASP.NET MVC Razor 中将数据绑定到布局模板

How to bind data to layout template in ASP.NET MVC Razor

我正在使用 ASP.NET MVC 5、Razor、EntityFramework 构建书店网站 我的实体

Category {
    int CateID,
    string CateName
}

Book {
    int BookID,
    int BookName
}

我的 _Layout.cshtml 有一个侧边栏(左侧菜单),它显示数据库中的所有类别(所有页面都相同)。 我有两个控制器:HomeController 和 BookController,这些控件的所有视图都会 使用上面的布局模板。 我想到了UserControl,我创建了一个UserControl name SideBarUserControl

@model List<Category>
 @if (ModelCount > 0)
    {
    <ul>
        foreach (var l in Model)
        {
            <li><a href="">@l.CateName</a></li>
        }
    </ul>
    }

在 Home/Index 看来:

@Html.Partial("_SideBarUserControl")

但我不知道把它的绑定代码放在哪里。如果我有一个 BaseController 有用吗,它是 HomeController 和 BookController 从它扩展而来。

既然你在 _Layout.cshtml 中执行数据库调用,那么我建议使用 Ajax 来获取数据?

在你的 _Layout 中创建一个 Ajax 对任何控制器上的东西的调用,我会亲自将它放入 HomeController.cs 但这是我自己的偏好。

然后根据该调用的结果在您的分部视图中呈现数据。

这样您就不必等待任何数据库调用完成,缺点是边栏不会与您的 DOM 加载同时出现。但是你总是可以通过使用像 Spin.js

这样的东西让它看起来更友好

操作方法

[HttpPost]
public ActionResult GetCategories()
{
  //Code to fetch the data for the partial
  return PartialView("_SideBarUserControl", model);
}

Ajax 例子

$(function () {
    $.ajax({
        type: "POST",
        url: '@Url.Action("GetCategories","Home")',
        success: function (data) { 
        var result = data; 
        $('targetLocation').html(result);
        }
    });
 });

这种方式是错误的!

ajax 在布局中调用使每次加载应用程序或每次打开页面时发生一个任务!!!

此方法可能有效,但不正确!

您需要在 mvc 核心中使用 viewComponent 或在 mvc 中使用部分视图并兑现。