我创建了一个HtmlHelperExtension。我想把它放在Cache中以提高性能。缓存中的数据应该具有每个视图的范围(我的意思是每个视图都应该有自己的密钥才能从缓存中获取数据)。是否可以仅使用HtmlHelper
(传递给扩展名)来构建这样的密钥?
public static HtmlResourceManagerHelper Resources(this HtmlHelper htmlHelper)
{
var cacheData = this.cache.Get(BuildKeyForView(htmlHelper));
}
public static string BuildKeyForView(HtmlHelper htmlHelper)
{
// build key per view
}
答案 0 :(得分:1)
如果您使用的是Razor或WebForm视图,它们都会从公开视图路径的BuildManagerCompiledView
继承。
因此,您可以将其用作缓存键:
string key = String.Empty;
var view = htmlHelper.ViewContext.View as BuildManagerCompiledView;
if (view != null)
{
key = view.ViewPath;
}
//Check here key is not empty or use a default value if that makes sense on your use case
但是,如果从视图中,让我们说登录视图,则渲染部分视图,让我们说 _LoginPartial 视图,你需要注意的是,在这两种情况下,上面返回的视图路径都是主视图 Login 之一。
另一个选项可能是根据控制器,操作和区域名称创建缓存键:
string controller = htmlHelper.ViewContext.RouteData.GetRequiredString("controller");
string action = htmlHelper.ViewContext.RouteData.GetRequiredString("action");
string area = String.Empty;
object areaObject;
if (htmlHelper.ViewContext.RouteData.DataTokens.TryGetValue("area", out areaObject))
{
area = areaObject as string;
}
string key = String.Format("{0}:{1}:{2}", action, controller, area);
但是在这种情况下,如果根据某些条件从同一控制器操作返回2个不同的视图,它们将获得相同的密钥。如果从不同的控制器操作返回相同的视图,则会有不同的缓存键。因此,根据您的使用情况,这可能不是一种有效的方法。
希望它有所帮助!