剃刀引擎无法找到视图

时间:2017-05-16 08:40:57

标签: razor asp.net-core-mvc razorengine

我试图在不使用网络请求的情况下从视图中呈现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;

2 个答案:

答案 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