5

我有一个处理“课程”的 MVC4 项目。整个应用程序中的许多页面都需要处理课程列表 - 用户配置文件需要拉出列表,/Courses 的索引视图需要拉出列表等。

由于这些数据几乎总是需要的,我想将它作为初始请求的一部分加载,所以我只需要查询数据库一次。

我想象一个场景,数据被放置在 Layout.cshtml 中,然后其他视图可以根据需要访问模型数据,尽管我没有看到实现这一点的明确方法。我想我可以把问题分成两部分:

  1. 获取加载到 Layout.cshtml 中的数据
  2. 从其他视图访问此数据

我对两者都有点坚持 - 我怎样才能做到这一点?

4

3 回答 3

7

您应该使用Cacheor OutputCache,将此列表放入 a Partial View,然后在您需要的任何地方渲染它:

1) 创建一个Action来填充Partial View. 此视图将被缓存最长持续时间,然后任何访问都不会产生任何开销:

[NonAction]
[OutputCache(Duration = int.MaxValue, VaryByParam = "none")]
public ActionResult GetCourses()
{
  List<Course> courses = new List<Course>();

  /*Read DB here and populate the list*/

  return PartialView("_Courses", courses);
}

2)以相同的方式使用Chache填充:Partial View

[NonAction]
public ActionResult GetCourses()
{
  List<Course> courses = new List<Course>();

  if (this.HttpContext.Cache["courses"] == null)
  {
    /*Read DB here and populate the list*/

    this.HttpContext.Cache["courses"] = courses;
  }
  else
  {
    courses = (List<Course>)this.HttpContext.Cache["courses"];
  }

  return PartialView("_Courses", courses);
}

Html.Action3)通过或呈现此视图Html.RenderAction

@Html.Action("GetCourses", "ControllerName")

或者

@{ Html.RenderAction("GetCourses", "ControllerName"); }

有关缓存的更多信息:使用输出缓存提高性能

于 2013-09-18T18:50:33.103 回答
1

我有两个答案,因为我不确定我是否理解你的愿望。

1)创建静态辅助方法:

public static class Helper
{
  public static List<Course> GetCourses()
   {
    return db.Courses.ToList();
    }

}

然后你可以在 View 或 Layout 中到处调用它:

@Helper.GetCourses()

2) 我不喜欢在Viewsor中呈现业务逻辑Layout。我会创建BaseController. 进入List<Course>这个控制器。其他控制器应该继承自BaseController. 因此,在任何控制器的方法中,您都可能拥有相同的List<Course>.

于 2013-09-18T19:37:33.073 回答
0

将课程存储在HttpContext.Current.Items其中,这将为您的情况理想的一个请求缓存项目。或者使用一些第三方缓存组件比如memcache

于 2013-09-18T19:41:08.663 回答