【问题标题】:Add database data to every razor view page将数据库数据添加到每个剃须刀视图页面
【发布时间】:2013-11-30 16:46:25
【问题描述】:

所以我希望从数据库中获取数据并将其添加到每个视图页面。所以将其添加到 Views/Shared/_Layout.cshtml

如何在不将模型添加到每个控制器的视图中的情况下做到这一点?

我想将数据库中的菜单项动态添加到每个视图中,我在 _Layout.cshtml 中有这个:

@foreach (var item in Model)
{
    <li><a href="/Cms/@item.Url">@item.Title</a></li>
}

这在我的 HomeController 中:

return View(db.Menus.ToList());

但我不想在每个控制器操作中都这样做,我怎样才能使它更简单?

【问题讨论】:

    标签: c# asp.net .net razor


    【解决方案1】:

    使用RenderAction 方法只渲染你想要的部分。

    我强烈建议您查看MVC Music Store 项目 - 它包含许多最佳实践。您的确切问题的解决方案在于_Layout.cshtml文件,代码:

       @{Html.RenderAction("GenreMenu", "Store");}
    

    【讨论】:

    • mvc音乐商店项目不是基于MVC3的吗?我认为我正在使用 MVC5
    • 适用于 MVC3。但这些是 MVC3 中没有改变的基础。顺便说一句,MVC5 刚刚发布不久,现在判断哪种做法最好还为时过早。
    【解决方案2】:

    假设您有一个模型,它代表您数据库中的菜单

    class MenuItem()
    {
      public int Id { get; set; }
      public string Name { get; set; }
      //...
    }
    

    为了让这个进入每个视图页面,您需要创建一个“BaseController”,所有其他控制器都从该“BaseController”继承。在此控制器中,您可以在构造函数中定义菜单。

     public class BaseController : Controller
     {  
        public BaseController()
        {
            //I don't know how you get your data
            ViewBag.DatabaseMenu =  repository.GetMenuItems();
        }
     }
    

    从此时起,将: BaseController 添加到您的所有控制器中,您将在所有页面的 ViewBag 中都有一个DatabaseMenu 可用,以用于构建您的菜单。

    在您看来,如何做到这一点取决于您自己。您可以创建 List&lt;MenuItem&gt; 类型的集合并说 List&lt;MenuItem&gt; Menu = ViewBag.DatabaseMenu; 并在您的项目上使用 foreach 进行迭代以创建菜单

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 2019-09-02
      • 2016-10-17
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 2018-05-30
      • 1970-01-01
      相关资源
      最近更新 更多