如何为每个视图构建Html Helper的唯一键?

时间:2014-06-25 07:13:13

标签: c# asp.net-mvc html-helper

我创建了一个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
}

1 个答案:

答案 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个不同的视图,它们将获得相同的密钥。如果从不同的控制器操作返回相同的视图,则会有不同的缓存键。因此,根据您的使用情况,这可能不是一种有效的方法。

希望它有所帮助!