【问题标题】:Embedded view can not be found in ASP.NET Core MVC在 ASP.NET Core MVC 中找不到嵌入式视图
【发布时间】:2018-06-11 14:22:26
【问题描述】:

我不能reuse my cshtml files from another assembly。这是简单的示例:

  • 使用默认模板(使用Web-Application、Model-View-Controller)创建一个ASP.NET Core Web Application项目,并将其命名为ViewReuse
  • 添加一个名为ViewLibrary的类库
  • 在 ViewLibrary 中添加对 Microsoft.AspNetCore.All 元包的引用
  • 创建一个名为 Views 的文件夹,然后创建另一个名为 Shared 的文件夹,并在其中创建一个名为 ReusedLayout.cshtml 的简单 cshtml 文件
  • EmbeddedResources Include='Views\**\*.cshtml' 添加到 ViewLibrary 的 csproj,以包含 ViewLibrary.dll 中的所有视图
  • 在 ViewReuse 项目的 Startup.cs 中,将 MVC 服务的配置更改为 services.AddMvc().ConfigureApplicationPartManager(p => { p.ApplicationParts.Add(new AssemblyPart(typeof(ReusedController).Assembly)); });
  • 更改 About.cshtml 以使用 ViewLibrary 中的布局:Layout = "/Views/Shared/ReusedLayout.cshtml"
  • 然后运行应用程序,导航到/home/about

对我来说,我遇到了这个错误:

InvalidOperationException:布局视图 找不到“/Views/Shared/ReusedLayout.cshtml”。这 搜索了以下位置:/Views/Shared/ReusedLayout.cshtml

我做错了什么?我该如何解决这个问题?

【问题讨论】:

    标签: asp.net-mvc razor reusability


    【解决方案1】:

    我通过以下方式解决了:

    Razor 类库项目

    首先,我使用 Razor dll 库项目创建了一个名为 RazorDll 的解决方案,并删除了其中的所有内容。现在为视图创建 MVC 结构。出于测试目的,我在那里添加了一个名为_Layout2 的文件。

    还要在项目根目录中添加一个空的Startup类,以便以后进行程序集检测:

    namespace RazorDll {
        public class Startup {
        }
    }
    

    嵌入所有 Razor 文件很重要!你有两种方法:

    全部嵌入 .csproj 文件属性中

    如果您的项目仅用于嵌入所有 Razor 视图,这是最佳选择,因为您不必手动编辑每个视图的文件属性。只需右键单击项目并选择编辑项目文件,或用任何文本编辑器打开对应的.csproj文件,然后在<Project>中插入以下内容

      <ItemGroup>
        <EmbeddedResource Include="Views\**\*.cshtml">
          <CopyToOutputDirectory>Never</CopyToOutputDirectory>
        </EmbeddedResource>
      </ItemGroup>
    

    手动嵌入单个 Razor 视图

    只需右键单击 Razor views .cshtml 文件,选择 properties 并将构建操作设置为 embedded ressource。对于要从​​另一个 .NET Core 程序集使用的每个视图都是必需的。

    为 Razor 类库使用 MVC 项目

    现在创建 MVC 项目,在此处称为 MvcDemo。这是链接到我们的 Razor dll 的普通 ASP.NET Core 2.1 MVC 项目(此处选择 LTS,但也应与 2.2 一起使用)

    要在 Assembly 中搜索 Razor 视图,我们将其添加到 Startup.ConfigureServices 方法中:

    var viewAssembly = typeof(RazorDll.Startup).GetTypeInfo().Assembly;
    var fileProvider = new EmbeddedFileProvider(viewAssembly);
    services.Configure<RazorViewEngineOptions>(options => {
        options.FileProviders.Add(fileProvider);
    });
    

    注意 typeof 中的完全限定类型,以区分消费 MVC 项目的 Startup 类(将在没有命名空间的情况下加载)和 Razor 类库。

    您已准备好进行更改,例如_ViewStart.cshtml 从我们的 Razor 类库中使用我们的测试 _Layout2

    @{
        Layout = "_Layout2";
    }
    

    一个简单的 POC 演示项目的结果:

    【讨论】:

      【解决方案2】:

      尝试右键单击视图文件并在属性中更改为嵌入资源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 1970-01-01
        • 2022-08-12
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        相关资源
        最近更新 更多