如何为每个视图的HtmlHelper构建唯一的键

本文关键字:HtmlHelper 构建 唯一 视图 | 更新日期: 2023-09-27 18:10:15

我已经创建了一个HtmlHelperExtension。为了提高性能,我想把某些东西放在缓存中。缓存中的数据应该有每个视图的作用域(我的意思是每个视图都应该有自己的键,以便从缓存中获取数据)。是否有可能仅使用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
}

如何为每个视图的HtmlHelper构建唯一的键

如果你使用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

然而,如果从一个视图,让我们说Login视图,你渲染一个局部视图,让我们说_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个不同的视图,它们都将获得相同的键。如果你从不同的控制器动作返回相同的视图,你会有不同的缓存键。因此,根据您的用例,这可能不是一个有效的方法。

希望有帮助!