我试图在不使用网络请求的情况下从视图中呈现html。我需要HTML作为字符串,在内部,我不希望提供它。
viewEngine.FindView()返回一个viewEnineResult,显示未找到任何视图。它显示搜索它们看起来像这样的位置:
/Views//PDFOperationsReportView.cshtml
/Views/Shared/PDFOperationsReportView.cshtml
(观察第一行中的双正斜杠)
文件结构(我将其放入HTML代码段,因为我无法在此编辑器中正确设置格式化文本)
Project
Folder
Subfolder
CodeFile.cs
Views
PDFOperationsReportView.cshtml

代码:
var viewName = "PDFOperationsReportView";
var actionContext = GetActionContext();
var viewEngineResult = _viewEngine.FindView(actionContext, viewName, false);
if (!viewEngineResult.Success)
{
throw new InvalidOperationException(string.Format("Couldn't find view '{0}'", viewName));
}
var view = viewEngineResult.View;
答案 0 :(得分:6)
我有同样的问题。我在这里找到了答案:GitHub aspnet/Mvc Issue #4936
基本上,使用GetView
代替FindView
,如下所示:
var viewResult = razorViewEngine.GetView(viewName, viewName, false);
答案 1 :(得分:0)
我们定义了一个辅助方法来呈现可能存在或可能不存在的可选视图:
public static Task RenderPartialAsyncIfExists(this IHtmlHelper htmlHelper, ICompositeViewEngine engine, string partialViewName, object model)
{
if (engine.GetView(partialViewName, partialViewName, false).Success)
{
return htmlHelper.RenderPartialAsync(partialViewName, model);
}
return Task.CompletedTask;
}
它用于以下视图页面:
@inject ICompositeViewEngine Engine
...
@{ await Html.RenderPartialAsyncIfExists(Engine, $"~/Views/Shared/_navigationAdmin.cshtml"); }
此方法可以在本地(IIS Express)上找到,但是由于某些原因在部署到IIS时失败。
就我而言,.csproj文件出了点问题,该视图中的视图已删除,但随后又重新添加为嵌入式资源:
<ItemGroup>
<Content Remove="Views\Shared\_navigationAdmin.cshtml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Views\Shared\_navigationAdmin.cshtml" />
</ItemGroup>
从.csproj中删除这两个部分可以解决IIS中的问题。
这正在使用(EOL)AspNet Core 2.2