c#MVC5加载菜单项的正确位置是什么
我有一个小问题,你能解释一下使用MVC5和实体框架6从DB加载菜单项的最佳实践是什么吗。菜单和本地化对象只能加载一次,然后仅从某个全局可用的集合中使用。网站发布后,它们不会有太多变化,所以我只是想实现一些Update()方法,必要时我会调用它…使用子操作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() {
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
ofGlobal.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();
}
}