让所有的孩子在父母Tag Helper Asp.Net Core中使用Tag Helpers

时间:2017-07-03 14:46:27

标签: c# razor asp.net-core asp.net-core-tag-helpers

我正在尝试编写两个用于在剃刀视图中本地化字符串的Tag帮助程序。父标记的目的是收集子标记所请求的所有密钥,并在一个批处理中从数据库中获取它们并缓存它们。

然后子标签将使用缓存版本,这样我希望降低数据库的负载。我正在寻找这样的东西:

<parent-tag>
   <child-tag key="Hello" /> 
     some HTML here
   <child-tag key="Hi!" /> 
</parent-tag>

我希望能够在Parent标记的Invoke方法中获取对象列表。

我也试过了storing data in TagHelperContext to communicate with other tag helpers,但这也行不通,因为我必须在Parent的Invoke方法中调用output.GetChildContentAsync(),这会破坏缓存的整个目的。

1 个答案:

答案 0 :(得分:1)

@ Encrypt0r你可以拥有TagHelpers context.Items和你的本地化密钥的内存中静态缓存关系。这将涉及使用您的context.Items执行GetChildContentAsync一次。然后通过查找基于context.Items的键值(假设键值不是动态的)来缓存所有后续时间。

这样想:

// Inside your TagHelper
if (_cache.TryGetValue(context.UniqueId, out var localizationKeys))
{
    ... You already have the keys, do whatever
}
else
{
    var myStatefulObject = new SomeStatefulObject();
    context.Items[typeof(SomeStatefulObject)] = myStatefulObject;
    await output.GetChildContentAsync();
    _cache[context.UniqueId] = new LocalizationKeyStuff(myStatefulObject);
}