2016-04-22 127 views
5

我正在使用ASP.NET MVC CORE。我已经实现了自己的ViewLocationExpander,以便我可以按照自己的方式构建项目,并将我的视图放置在我喜欢的位置。什么是在ASP.NET MVC的IViewLocationExpander.PopulateValues()()MVC

这是通过实现从IViewLocationExpander继承和大部分工作发生在下列方法的类来实现:

ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) 

一切工作非常甜蜜,但接口定义我就不说了一个方法第2知道如何正确地执行:

PopulateValues(ViewLocationExpanderContext context) 

我读过的文章各地有关此接口的互联网,但没有人真正提供的正是这种方法是什么其他的很多信息,不是说关于它如何帮助W¯¯模糊的东西ith缓存。

如果有人能够解释框架如何使用这种方法,以及如何恰当地使用它来辅助缓存(如果确实如此),我将非常感激。

回答

4

也许从GitHub MVC issue可以回答你的问题直接采取以下额外信息:

缓存包括其查找的Values词典。除非PopulateValues()方法将不同的信息添加到ViewLocationExpanderContext.Values,否则ExpandViewLocations()方法将仅对每个原始文件名称调用一次,即从此开始缓存初始信息。

最重要的是,由OP所带来的具体的例子可以帮助理解甚至更好,至少这就是发生在我身上:

  • 他的项目有以下两种不同的目录 具有相同名称的意见树木(比方说FooBar
  • 根据由当前操作的上下文中提取某些数据,以定位视图应当根据任一那些树之一

PopulateValues()中没有任何代码,查看引擎将询问一旦定位该视图,然后使用视图“标准”数据(例如, ControllerNameActionName,Area等)以便缓存发现视图的实际位置。因此,在OP的情况下,一旦视图位置被缓存(例如从Foo目录树中),每次需要具有相同名称的视图时,它将始终来自该树,将不可能检测到其他Bar树应该实际上被拾起。

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

其他信息有两种使用方式:ExpandViewLocations()可能会在调用时使用它们以确定正确的位置,而视图引擎会在发现后使用它们来缓存视图位置。

+0

谢谢!这正是我想要学习6个月以上的信息!这个信息需要更好地在网络上公布。不错的工作! –

+0

感谢你,因为我也有机会明白这一点。顺便说一句,我同意需要改进那一点的文档 – superjos

+1

更新:我实际上注意到官方[文档页面](https://docs.microsoft.com/en-us/aspnet/core/api/microsoft.aspnetcore.mvc .razor.iviewlocationexpander)现在更具描述性:*填充值用于确定缓存键 - 如果所有值与最后一次调用PopulateValues(ViewLocationExpanderContext)时的值相同,则缓存的结果将用作视图位置。 – superjos

2

基本方法可以填充值代入,稍后将用于确定是否应使用缓存列表,或者如果ExpandViewLocations将被称为context.Values ....

+0

你能解释这一点吗?当你说“稍后将用于确定是否应该使用缓存列表”时,它是如何工作的?我需要在'context.Values [key]'中使用什么键才能使用缓存值?价值需要在什么格式? –

3

还没有与它周围的混乱足以能够给你一个具体的答案,但看看IViewLocationExpander.PopulateValues(ViewLocationExpanderContext context)在ASP.NET MVC GitHub库:

public interface IViewLocationExpander 
{ 
    /// <summary> 
    /// Invoked by a <see cref="RazorViewEngine"/> to determine the values that would be consumed by this instance 
    /// of <see cref="IViewLocationExpander"/>. The calculated values are used to determine if the view location 
    /// has changed since the last time it was located. 
    /// </summary> 
    /// <param name="context">The <see cref="ViewLocationExpanderContext"/> for the current view location 
    /// expansion operation.</param> 
    void PopulateValues(ViewLocationExpanderContext context); 

    // ...other method declarations omitted for brevity 
} 

可读性格式:

“通过调用RazorViewEngine来确定这个IViewLocationExpander实例将要消耗的值。计算的值用于确定自上次查找位置以来是否发生了更改。 。

参数:

context:本ViewLocationExpanderContext当前视图位置伸展动作”

我有一个看一些它实现这个接口 - 某些声明的方法,但离开它空的,其他人实现它

NonMainPageViewLocationExpander.cs

public void PopulateValues(ViewLocationExpanderContext context) 
{ 
} 

LanguageViewLocationExpander.cs

private const string ValueKey = "language"; 

public void PopulateValues(ViewLocationExpanderContext context) 
{ 
    if (context == null) 
    { 
     throw new ArgumentNullException(nameof(context)); 
    } 

    // Using CurrentUICulture so it loads the locale specific resources for the views. 
#if NET451 
    context.Values[ValueKey] = Thread.CurrentThread.CurrentUICulture.Name; 
#else 
    context.Values[ValueKey] = CultureInfo.CurrentUICulture.Name; 
#endif 
} 

的制品"View Location Expander in ASP.NET Core and MVC 6"提供了一个例子。以下是解释的摘录:

您可以根据需要添加尽可能多的视图位置扩展器。 IViewLocationExpander接口有2种方法,PopulateValuesExpandViewLocationsPopulateValues方法允许您添加可以由ExpandViewLocations方法稍后使用的值。您在PopulateValues方法中的值将用于查找缓存键。ExpandViewLocations方法将仅在缓存键没有缓存结果或框架无法在缓存结果中找到视图时调用。在ExpandViewLocations方法中,您可以返回动态视图位置。现在你可以在Startup.cs文件中注册该视图位置扩展,

services.Configure<RazorViewEngineOptions>(options => 
{ 
    options.ViewLocationExpanders.Add(new MyViewLocationExpander()); 
}); 
+0

这很有帮助,但如果我已经实现了'ExpandViewLocations'来提供自定义位置来搜索视图,我仍然不明白我应该在'PopulateValues'中实现什么。思考? –

+0

我还没有搞砸了,足以给你一个明确的答案。但是,我已经为您提供了实现和不实现该方法的类的示例,并附加了weblogs.asp.net文章的摘录。我认为把所有的信息放在一起给你一个(粗略的)事情工作的概述。 – trashr0x

+0

我欣赏你提供的信息,因此得到了满意的结果,但最终我需要有人回答这个部分:如果有人能够解释框架如何使用这种方法,以及如何恰当地使用它来辅助缓存,我真的很感激它。这确实是它的目的。 –