asp.net-core-mvc – 什么是Asp.Net Core MVC中的IViewLocationExpander.PopulateValues()

前端之家收集整理的这篇文章主要介绍了asp.net-core-mvc – 什么是Asp.Net Core MVC中的IViewLocationExpander.PopulateValues()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用ASP.NET MVC CORE.我已经实现了自己的ViewLocationExpander,这样我就可以按照我想要的方式构建项目,并将我的视图放在我喜欢的位置.

这是通过实现一个继承自IViewLocationExpander的类来完成的,并且大多数工作都在以下方法中进行:

ExpandViewLocations(ViewLocationExpanderContext context,IEnumerable<string> viewLocations)

一切都工作得很好,但界面定义了第二种方法,我不知道如何正确实现:

PopulateValues(ViewLocationExpanderContext context)

我已经在互联网上阅读了关于这个界面的文章,但没有人真正提供过关于这个方法究竟是什么的更多信息,而不是说有关它如何帮助缓存的模糊事物.

如果有人可以解释框架如何使用这种方法以及如何适当地使用它来帮助缓存(如果它确实是它的用途),我真的很感激.

解决方法

也许直接从 GitHub MVC issue获取的以下附加信息可以回答您的问题:

Caching includes the Values dictionary in its lookup. Unless the PopulateValues() method adds distinct information to ViewLocationExpanderContext.Values,the ExpandViewLocations() method will be called just once per original file name i.e. the initial information is cached from then on.

最重要的是,OP提出的特定示例可以帮助更好地理解,至少这是发生在我身上的事情:

>他的项目在两个不同的目录下有相同的名称
树木(说Foo和Bar)
>根据当前操作上下文提取的某些数据,要查找的视图应位于其中一个树下

如果没有PopulateValues()中的任何代码,视图引擎将询问一次查找视图,然后使用视图“标准”数据(例如ControllerName,ActionName,Area等)以缓存查找视图的实际位置.

因此,在OP情况下,一旦视图位置被缓存(例如来自Foo目录树),每当需要具有相同名称的视图时,它将始终来自该树,将无法检测另一个中的那个是否存在.酒吧树本应该被拿起来.

OP的唯一方法是通过向Values字典添加特定的,独特的视图细节来自定义PopulateValues():在当前场景中,这些是从当前操作上下文中提取的信息.

附加信息使用双重:ExpandViewLocations()可能在调用时使用它们以确定正确的位置,而视图引擎将使用它们一旦找到就缓存视图位置.

猜你在找的.NET Core相关文章