MVC3拥有数十万个布局/模板

时间:2012-03-14 11:03:45

标签: asp.net-mvc-3 layout

我有一个应用程序,每个用户都可以选择自定义布局。布局可以是不同的,它不仅仅是CSS样式,还有html。

我知道mvc会缓存布局,但是有这么多布局我怀疑它会适合缓存。那么在DB或磁盘上保存模板会更好吗?

仅供参考:我正在使用的数据库是MongoDB。

1 个答案:

答案 0 :(得分:1)

我会将布局保存在磁盘上,因为目前我在数据库中看不到任何优势(除非你这样做)。但值得一提的是,您可以创建一个派生自OutputCacheAttribute的类,并将保存的结果取决于您正在使用的布局。

布局是否依赖于用户?您可以使用VaryByCustom property使其因用户而异。

修改

您的用户是否允许以动态方式更改布局?如果是的话,您还应该有一个与用户关联的guid,每次布局更改时都会更改它,以便您返回VaryByCustom方法:

return string.Format("User-{0}-{1}", user.Id, user.LayoutUpdateGuid);

看到这个意思?这样,当用户更改布局时,他们将立即看到他们的页面更​​新。

如何在您的情况下应用VaryByCustom属性

在您的操作方法中,您可以使用:

[OutputCache(Duration = 3600, VaryByCustom = "UserLayouts")]
public ActionResult Details(string param)
{
   // Returning the view
}

然后,在Global.asax.cs文件中的VaryByCustom方法中:

protected override string VaryByCustom(string custom)
{
  switch (custom)
  {
    case "UserLayouts":
      //// Here you fetch your user details so you can return a unique
      //// string for each user and "publishing cycle" 
      //// Also, I strongly suggest you cache this user object and expire it
      //// whenever the user is changed (e.g. when the LayoutUpdateGuid is
      //// changed) so you achieve maximum speed and not defeat the purpose
      //// of using output cache.
      return string.Format("User-{0}-{1}", user.Id, user.LayoutUpdateGuid);
    break;
  }
}

缺失的部分

这里缺少的部分是你需要存储我称为LayoutUpdateGuid的值(我确定你会找到一个更好的名字)并在用户更改布局时更改该值=>这将导致Global.asasx.cs中的VaryByCustom(字符串)方法返回一个不同的字符串,这反过来将强制您的操作方法再次运行并返回更新布局的结果。

对你有意义吗?

注意:我无法测试我在这里写的具体代码,但我确信(除了错别字)它是正确的。