c#MVC5加载菜单项的正确位置是什么

c#MVC5加载菜单项的正确位置是什么,c#,asp.net-mvc,razor,entity-framework-6,C#,Asp.net Mvc,Razor,Entity Framework 6,我有一个小问题,你能解释一下使用MVC5和实体框架6从DB加载菜单项的最佳实践是什么吗。菜单和本地化对象只能加载一次,然后仅从某个全局可用的集合中使用。网站发布后,它们不会有太多变化,所以我只是想实现一些Update()方法,必要时我会调用它…使用子操作 public class FooController : Controller { ... [ChildActionOnly] public ActionResult SiteMenu() {

我有一个小问题,你能解释一下使用MVC5和实体框架6从DB加载菜单项的最佳实践是什么吗。菜单和本地化对象只能加载一次,然后仅从某个全局可用的集合中使用。网站发布后,它们不会有太多变化,所以我只是想实现一些Update()方法,必要时我会调用它…

使用子操作

public class FooController : Controller
{
    ...

    [ChildActionOnly]
    public ActionResult SiteMenu()
    {
        // load menu items however you need to

        return PartialView("_SiteMenu", menuModel);
    }
}
/Views/Shared/_sitemunu.cshtml

@model Namespace.To.MenuModel

<!-- render your menu here -->
<!-- wherever you want the menu to display -->
@Html.Action("SiteMenu", "Foo")
@model Namespace.To.MenuModel
/Views/Shared/_Layout.cshtml

@model Namespace.To.MenuModel

<!-- render your menu here -->
<!-- wherever you want the menu to display -->
@Html.Action("SiteMenu", "Foo")

@动作(“站点菜单”、“Foo”)

如果您希望缓存结果,这样就不必每次请求都从数据库中提取菜单,那么您可以像其他任何操作一样,在子操作上使用
OutputCache
属性。

正如我已经说过的,我想到了Global.asax 因此,目前我有两种方法可以使用Global.asax实现这一点:

更新使用此方法是个坏主意,请使用第二种方法

public static ICollection<MenuItem> MenuItems {
    get
    {
        if (Application["MenuItems"] != null)
            return (ICollection<MenuItems>)Application["MenuItems"];
        else
            return new ICollection<MenuItems>();
    }
    set
    {
        Application["MenuItems"] = value;    
    }
}

private void LoadMenuItems()
{
    MyContext mc = new MyContext();
    this.MenuItems = ms.MenuItems.Include("SubCategories").AsNotTacking().where(x => x.SubCategory == null).ToArray();
} 

protected void Application_Start(object sender, EventArgs e)
{
    this.MenuItems = LoadMenuItems();
}

如果您/我将“LoadMenuItems”方法转换为“静态”方法,那么您/我将能够在需要时更新MenuItems和/或本地化项目集合

这可能会对您有所帮助:
Application\u Start
of
Global.asax
将是这个代码的好去处。@Ramilu:天哪,我考虑过Global.asax,但如果我理解正确,我必须实现一个静态方法。但每次访问时,它会从数据库中获取项目吗?除此之外,如果您使用outputcache并要更新菜单内容,则只有在要缓存一段几乎不确定的时间时,才需要重置缓存。在菜单上设置一个生命周期,比如说一个小时,就足以减少对数据库的任何不必要的压力,并且在更新发生时仍能获得相对及时的更新。还要记住,缓存是基于内存的,因此即使缓存了相当长的时间,也不能保证不会更频繁地刷新。为什么不使用Global.asax或Application[“menuItems”]?Global.asax是应用程序的心脏。它应该是精益的,并执行最低限度的引导一切。这就是为什么
App\u Start
文件存在的原因:为了避免您接触Global.asax。使用OutputCache varybycustom-然后向Global.asax文件添加一个覆盖以处理VaryByCustomString,然后根据请求区域设置进行缓存-这样每个本地缓存一次。您可以将持续时间设置为非常长的时间。
public class MvcApplication : CustomHttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        MenuItems = this.LoadMenuItems();
    }
}