Razor引擎找不到视图。

17
我正在尝试从视图中呈现HTML,而不使用Web请求。 我需要将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;

你能添加GetActionContext的代码吗? - tmg
我现在也遇到了完全相同的问题。你找到解决方案了吗? - Matt
2个回答

16

我遇到了同样的问题。我在这里找到了答案:GitHub aspnet/Mvc Issue #4936

基本上,使用 GetView 而不是 FindView,像这样:

var viewResult = razorViewEngine.GetView(viewName, viewName, false);

为了使其起作用,您的视图名称需要是完整路径。例如:

  1. /Views/Shared/PDFOperationsReportView.cshtml
  2. ~/Pages/Shared/_Article.cshtml
  3. ~/Areas/CM/Pages/_Article.cshtml

只是有些东西你错过了,需要将路径变成相对路径,例如'~/bin/Debug/Views/MainView.cshtml'。 - Dragos Durlut
1
如果您的视图位于类库中,则可能会遇到缓存问题以及布局未更新或找不到的问题。解决方案是在启动文件夹中设置引擎。示例:https://dev59.com/xbTma4cB1Zd3GeqP5V6g#58659691 - Dragos Durlut
1
这个解决方案在 .Net Core 中运行... 谢谢。 - Shyam Bhagat
你应该将最后一个参数设置为true,否则如果视图具有布局,则不会包含它。 - Squibly

2

我们定义了一个辅助方法来呈现可选视图,这些视图可能存在也可能不存在:

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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接