这是通过实现一个继承自IViewLocationExpander的类来完成的,并且大多数工作都在以下方法中进行:
ExpandViewLocations(ViewLocationExpanderContext context,IEnumerable<string> viewLocations)
一切都工作得很好,但界面定义了第二种方法,我不知道如何正确实现:
PopulateValues(ViewLocationExpanderContext context)
我已经在互联网上阅读了关于这个界面的文章,但没有人真正提供过关于这个方法究竟是什么的更多信息,而不是说有关它如何帮助缓存的模糊事物.
如果有人可以解释框架如何使用这种方法以及如何适当地使用它来帮助缓存(如果它确实是它的用途),我真的很感激.
解决方法
Caching includes the
Values
dictionary in its lookup. Unless thePopulateValues()
method adds distinct information toViewLocationExpanderContext.Values
,theExpandViewLocations()
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()可能在调用时使用它们以确定正确的位置,而视图引擎将使用它们一旦找到就缓存视图位置.