gpt4 book ai didi

c# - 在 mvc 中使用 IViewLocationExpander

转载 作者:行者123 更新时间:2023-11-30 14:07:36 25 4
gpt4 key购买 nike

我想从自定义位置渲染 View ,为此我实现了IViewLocationExpander 类中的接口(interface)。我在 Startup 类中注册了相同的类,如下所示。

启动

public void ConfigureServices(IServiceCollection services)
{

//Render view from custom location.
services.Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(new CustomViewLocationExpander());
});

}

CustomViewLocationExpander

public class CustomViewLocationExpander : IViewLocationExpander
{
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
{

var session = context.ActionContext.HttpContext.RequestServices.GetRequiredService<SessionServices>();
string folderName = session.GetSession<string>("ApplicationType");

viewLocations = viewLocations.Select(f => f.Replace("/Views/", "/" + folderName + "/"));


return viewLocations;
}

public void PopulateValues(ViewLocationExpanderContext context)
{

}
}

最后,我的应用程序的 View 组织如下:

View folder structure

我的问题:如果我从以下 URL 的 ViewsFrontend 文件夹访问 Views/Login View :

http://localhost:56739/trainee/Login/myclientname 

然后立即将浏览器中的 URL 更改为:

http://localhost:56739/admin/Login/myclientname

在这种情况下,它仍然引用 ViewsFrontend 文件夹,尽管它现在应该引用 ViewsBackend 文件夹,因为 URL 开始以trainee开头的应该指ViewsFrontend文件夹,以admin开头的应该指ViewsBackend文件夹。

此外,在浏览器中更改 URL 后,它只会调用 PopulateValues() 方法,而不会调用 ExpandViewLocations() 方法。

我怎样才能重新配置这个类来为这个其他文件夹工作?

最佳答案

PopulateValues 作为一种指定参数的方式存在,您的 View 查找将根据每个请求而变化。由于您没有填充它, View 引擎使用来自早期请求的缓存值

要解决此问题,请将您的 ApplicationType 变量添加到 PopulateValues() 方法,并且只要该值就会调用 ExpandValues() 方法变化:

public class CustomViewLocationExpander : IViewLocationExpander
{
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
{
string folderName = context.Values["ApplicationType"];
viewLocations = viewLocations.Select(f => f.Replace("/Views/", "/" + folderName + "/"));

return viewLocations;
}

public void PopulateValues(ViewLocationExpanderContext context)
{
var session = context.ActionContext.HttpContext.RequestServices.GetRequiredService<SessionServices>();
string applicationType = session.GetSession<string>("ApplicationType");
context.Values["ApplicationType"] = applicationType;
}
}

关于c# - 在 mvc 中使用 IViewLocationExpander,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39471627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com