【问题标题】:Razor engine cant find viewRazor 引擎找不到视图
【发布时间】:2017-10-15 05:44:02
【问题描述】:

我试图在不使用 Web 请求的情况下从视图中呈现 html。我需要将 HTML 作为字符串,在内部,我不想提供它。

viewEngine.FindView() 返回一个 viewEnineResult 显示没有找到视图。它显示搜索位置看起来像这样:

/Views//PDFOperationsReportView.cshtml

/Views/Shared/PDFOperationsReportView.cshtml

(注意第一行的双斜杠)

文件结构(我将其放入 HTML sn-p 中,因为我无法在此编辑器中正确格式化文本)

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代码吗?
  • 我现在遇到了完全相同的问题。你找到解决方案了吗?

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


【解决方案1】:

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

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

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

【讨论】:

  • 只是一些你错过的东西,使路径相对像'~/bin/Debug/Views/MainView.cshtml'。
  • 如果您的视图位于类库中,您会发现缓存有问题,并且布局没有更新或找不到。解决方案是在 Startup 文件夹中设置引擎。示例:stackoverflow.com/a/58659691/249895
【解决方案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

【讨论】:

    猜你喜欢
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多