gpt4 book ai didi

asp.net-core - 带有 GetView 的 IrazorViewEngine.FindView 找不到 View

转载 作者:行者123 更新时间:2023-12-04 13:55:45 25 4
gpt4 key购买 nike

在我的 asp.net 核心项目中,我尝试使用以下方法查找 Razor View :

private IView FindView(ActionContext actionContext, string viewName)
{
var getViewResult = _viewEngine.GetView(executingFilePath: null, viewPath: viewName, isMainPage: true);
if (getViewResult.Success)
{
return getViewResult.View;
}

var findViewResult = _viewEngine.FindView(actionContext, viewName, isMainPage: true);
if (findViewResult.Success)
{
return findViewResult.View;
}

var searchedLocations = getViewResult.SearchedLocations.Concat(findViewResult.SearchedLocations);
var errorMessage = string.Join(
Environment.NewLine,
new[] { $"Unable to find view '{viewName}'. The following locations were searched:" }.Concat(searchedLocations));

throw new InvalidOperationException(errorMessage);
}
在哪里
viewName = "Views/Email/ResetPassword.cshtml"
_viewEngineIRazorViewEngine ,但它没有找到任何。
我的项目结构:
Project structure IView.FindView方法是从 Business 调用的。
我还有另一个项目,它具有项目结构并使用相同的方法来检索 View ,更重要的是,它找到了这个 View ,但它使用的是 netcoreapp2.2,而我当前的项目使用的是 netcoreapp3.1 (Microsoft.AspNetCore.Mvc .Razor 版本相同 - 2.2.0)。
为什么这个方法在.net core 3.1上找不到views?

更新
两个项目都将此 Views 文件夹复制到 Api\bin\Debug\netcoreapp{version}构建中的文件夹。

最佳答案

虽然我是在 Core 3.1 中从头开始构建东西,而不是从早期版本升级,但我遇到了同样的问题。我通过执行以下操作来解决问题:
我创建了一个 IWebHostEnvironment 的实现(我调用我的 DummyWebHostEnvironment.cs)。除了接口(interface)的一个属性之外,我保留了默认实现的所有属性;对于那个属性,我使用了包含 View 的项目的名称。 (为了简洁起见,我只是将它硬编码到下面的示例中;显然有更灵活的方法来获取它。)

 public class DummyWebHostEnvironment : IWebHostEnvironment
{
public IFileProvider WebRootFileProvider { get => throw new System.NotImplementedException(); set => throw new System.NotImplementedException(); }
public string WebRootPath { get => throw new System.NotImplementedException(); set => throw new System.NotImplementedException(); }
public string ApplicationName { get => "TheProjectContainingMyViews.RazorClassLibrary"; set => throw new System.NotImplementedException(); }
public IFileProvider ContentRootFileProvider { get => throw new System.NotImplementedException(); set => throw new System.NotImplementedException(); }
public string ContentRootPath { get => throw new System.NotImplementedException(); set => throw new System.NotImplementedException(); }
public string EnvironmentName { get => throw new System.NotImplementedException(); set => throw new System.NotImplementedException(); }
}
备注 :从上面的代码可以明显看出,包含 View 的项目是一个 RazorClassLibrary。 (我使用 thisthis 作为让 RazorViewEngine 在控制台应用程序中工作的指南。)
我有上面的实现,我将它与其他一些好东西一起添加到我的服务集合中:
private static RazorViewToStringRenderer GetRenderer()
{
var services = new ServiceCollection();
var applicationEnvironment = PlatformServices.Default.Application;
services.AddSingleton(applicationEnvironment);

var appDirectory = Directory.GetCurrentDirectory();

var environment = new DummyWebHostEnvironment();
services.AddSingleton<IWebHostEnvironment>(environment);

services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();

var diagnosticSource = new DiagnosticListener("Microsoft.AspNetCore");
services.AddSingleton<DiagnosticSource>(diagnosticSource);
services.AddSingleton<DiagnosticListener>(diagnosticSource);

services.AddLogging();
services.AddMvc();
services.AddSingleton<RazorViewToStringRenderer>();
var provider = services.BuildServiceProvider();
return provider.GetRequiredService<RazorViewToStringRenderer>();
}
备注 :有关 RazorViewToStringRenderer 的代码,请参阅上面的第一个链接.这是界面:
public interface IRazorViewToStringRenderer
{
Task<string> RenderViewToStringAsync<TModel>(string viewName, TModel model);
}
然后,在 Program.cs ,我可以做这样的事情:
static async Task Main(string[] args)
{
var dto = BuildDto();
var renderer = GetRenderer();

var renderedString = await renderer.RenderViewToStringAsync("Views/Path/To/Some.cshtml", dto);
// ...

}

关于asp.net-core - 带有 GetView 的 IrazorViewEngine.FindView 找不到 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62900334/

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