我有一个应用程序,每个用户都可以选择自定义布局。布局可以是不同的,它不仅仅是CSS样式,还有html。
我知道mvc会缓存布局,但是有这么多布局我怀疑它会适合缓存。那么在DB或磁盘上保存模板会更好吗?
仅供参考:我正在使用的数据库是MongoDB。
答案 0 :(得分:1)
我会将布局保存在磁盘上,因为目前我在数据库中看不到任何优势(除非你这样做)。但值得一提的是,您可以创建一个派生自OutputCacheAttribute的类,并将保存的结果取决于您正在使用的布局。
布局是否依赖于用户?您可以使用VaryByCustom property使其因用户而异。
您的用户是否允许以动态方式更改布局?如果是的话,您还应该有一个与用户关联的guid,每次布局更改时都会更改它,以便您返回VaryByCustom方法:
return string.Format("User-{0}-{1}", user.Id, user.LayoutUpdateGuid);
看到这个意思?这样,当用户更改布局时,他们将立即看到他们的页面更新。
在您的操作方法中,您可以使用:
[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(字符串)方法返回一个不同的字符串,这反过来将强制您的操作方法再次运行并返回更新布局的结果。
对你有意义吗?
注意:我无法测试我在这里写的具体代码,但我确信(除了错别字)它是正确的。