将数据库数据添加到每个剃刀视图页面

时间:2013-11-30 16:46:25

标签: c# asp.net .net razor

所以我希望从数据库中获取数据并将其添加到每个视图页面。所以将它添加到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());

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

2 个答案:

答案 0 :(得分:0)

使用RenderAction方法仅渲染您想要的部分。

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

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

答案 1 :(得分:0)

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

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

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

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

从这一点开始,将: BaseController添加到您的所有控制器中,您可以在所有页面上的ViewBag中使用DatabaseMenu来构建菜单。

您在视图中如何执行此操作取决于您自己。您可以创建List<MenuItem>类型的集合并说出List<MenuItem> Menu = ViewBag.DatabaseMenu;并使用foreach迭代您的项目以创建菜单