如何将模型加载到_Layout.cshtml并在各种视图之间共享?

时间:2013-09-18 18:28:55

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

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

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

我想象一种情况,数据放在Layout.cshtml中,然后其他视图可以根据需要访问Model数据,尽管我没有看到实现这一目标的明确方法。我想我可以把问题分成两部分:

  1. 将数据加载到Layout.cshtml
  2. 从其他观点访问此数据
  3. 我对两者都有点困惑 - 我怎么能让这个工作?

3 个答案:

答案 0 :(得分:7)

您应该使用CacheOutputCache,将此列表放入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);
}

3)按Html.ActionHtml.RenderAction

呈现此视图
@Html.Action("GetCourses", "ControllerName")

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

有关缓存的更多信息:Improving Performance with Output Caching

答案 1 :(得分:1)

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

1)创建静态辅助方法:

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

}

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

@Helper.GetCourses()

2)我不想在ViewsLayout中呈现业务逻辑。我会创建BaseController。在此控制器中获取List<Course>。其他控制器应继承自BaseController。因此,在任何控制器的方法中,您可能具有相同的List<Course>实例。

答案 2 :(得分:0)

将课程存储在HttpContext.Current.Items中,此缓存一个请求的项目,这对您的案例是理想的。 或使用一些第三方缓存组件,如memcache