【问题标题】:ASP.NET Core Razor SDK Class Library - Area Views Not Within Areas DirectoryASP.NET Core Razor SDK 类库 - 不在区域目录中的区域视图
【发布时间】:2018-11-30 17:18:21
【问题描述】:

我正在尝试使用新的 Razor SDK 将我的视图包含在我的类库中,其中每个类库都是一个 MVC 区域。如果我在类库中包含带有区域目录的视图,例如

/MyLibrary/Areas/MyLibrary/Views/Home/Index.cshtml

然后它加载正常。但是我不喜欢我必须将它们放在区域目录中,理想情况下路径是:

/MyLibrary/Views/Home/Index.cshtml

我猜我必须使用视图位置扩展器来实现这一点。但是,对于包含在类库中而不是在应用程序中的视图,我不知道如何实现这一点。到目前为止,我想出了:

public class AreaViewLocationExpander : IViewLocationExpander {
    public virtual IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) {
        return viewLocations.Concat(new[] {
            "../{2}/Views/{1}/{0}" + RazorViewEngine.ViewExtension
        });
    }

    public virtual void PopulateValues(ViewLocationExpanderContext context) { }
}

这会引发错误:

InvalidOperationException:未找到视图“索引”。这 搜索了以下位置:

/Areas/MyLibrary/Views/Home/Index.cshtml

/Areas/MyLibrary/Views/Shared/Index.cshtml

/Views/Shared/Index.cshtml

/Pages/Shared/Index.cshtml

/../MyLibrary/Views/Home/Index.cshtml

但我想即使它在本地工作,它也不会在生产中或当库被打包在 NuGet 包中时。

如果有人能告诉我如何实现这一点,我将不胜感激。谢谢

【问题讨论】:

  • 很好奇。你为什么要升一级才能进入你的图书馆?
  • 我假设路径将从应用程序根目录开始。类库与应用程序位于同一目录中,因此我必须上一个目录才能找到它。我认为这至少在开发过程中会起作用。
  • 编译时引用的库将在 bin 中。
  • 看看这个看看能不能修改查看davepaquette.com/archive/2016/07/16/…
  • 是的,我知道,但我需要使用不同的路径在 dll 中加载视图。

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


【解决方案1】:

第 1 步

来自@pranavkm GitHub

Razor Sdk 使用众所周知的 MSBuild 元数据来计算项目 相对路径。您可以为文件和 Razor 设置链接元数据 会用那个。例如,将此添加到您的项目文件中 更新所有 cshtml 文件以具有项目的视图引擎路径 名称作为前缀:

<Target Name="UpdateTargetPath" BeforeTargets="AssignRazorGenerateTargetPaths">
  <ItemGroup>
    <RazorGenerate Include="@(RazorGenerate)" Link="$(TargetName)\%(RazorGenerate.RelativeDir)%(RazorGenerate.FileName)%(RazorGenerate.Extension)" />
  </ItemGroup>
</Target>

这不适用于运行时编译 - 即,如果您要 将此应用于 Application.csproj,它将适用于编译的构建时间 视图,但运行时编译的视图将继续使用 /Views/Home/Index.cshtml

第 2 步

然后您需要添加以下 IViewLocationExpander:

public class AreaViewLocationExpander : IViewLocationExpander {
    public virtual IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) {
        return viewLocations.Concat(new[] {
            "/{2}/Views/{1}/{0}" + RazorViewEngine.ViewExtension
        });
    }

    public virtual void PopulateValues(ViewLocationExpanderContext context) { }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 2011-08-07
    • 2018-03-11
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2016-12-18
    相关资源
    最近更新 更多