如何扩展剃须刀页面

时间:2019-02-19 12:16:49

标签: c# razor asp.net-core

我想使用Razor Pages创建一个ASP.NET Core 2.2项目。

我的目标是创建一个包含两类Razor Page的项目:

  • 标准类别:此类别包含将在多个项目中共享的所有Razor页面
  • 自定义类别:此类别包含与项目相关的所有Razor页面。

到目前为止,一切正常,我在“页面”目录中创建了两个子文件夹:标准文件夹,自定义文件夹。 我在每个项目中用我需要的所有剃须刀页面填充标准和自定义文件夹,其中所有剃须刀 在我的所有项目中,Standard folderz中包含的页面都是相同的。

例如

项目A:

  • /页
    • /标准
      • / SectionA
        • PageA
        • PageB
    • /自定义
      • / SectionE
        • PageD

项目B:

  • /页
    • /标准
      • / SectionA
        • PageA
        • PageB
    • /自定义
      • / SectionP
        • PageK

项目C:

  • /页
    • /标准
      • / SectionA
        • PageA
        • PageB
    • /自定义
      • / SectionV
        • PageJ

这就是我的问题:我将在每个项目中实施扩展标准的可能性 剃刀页面,也许是重写某些端点(例如,我想更改“ onGet”的行为 方法)或创建一个新的方法(例如“ onGetMyCustomGet”)。

我知道最简单的解决方案是更改标准剃刀页面内的代码,但是我想要 为避免这种情况,因为标准页面可以替换为新版本。因此,标准页面必须是 与项目无关并可以扩展。

我的想法是在“ / Custom”类别内创建一个“假”剃刀页面,以扩展标准剃刀 PageModel并覆盖我需要重新实现的所有方法。

问题是:如何退回标准 剃刀页面cshtml而不是fakeRazorPage cshtml?有可能吗?

在这里,您会发现一个示例项目https://github.com/Blackleones/RazorPageResearch,如果您想进行协作,可以随时发送请求请求。

如果没有解决方案,则接受其他想法

1 个答案:

答案 0 :(得分:2)

您不必到处复制和粘贴标准页面的源代码。只需创建一个单独的Razor类库项目并在Project A / Project B / Project C中引用它,然后就可以根据需要自定义任何内容。

假设您创建一个新项目RazorResearch.Core作为“标准”页面:

<Project Sdk="Microsoft.NET.Sdk.Razor">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.2" />
  </ItemGroup>
</Project>

这是RazorResearch.Core项目的目录结构:

└───Pages/
    └───SectionA/
        └───PageA.cshtml
        └───PageA.cshtml.cs
        └───PageB.cshtml
        └───PageB.cshtml.cs
└───RazorResearch.Core.csproj

现在引用此RazorLib:

dotnet add reference <path-to-the-RazorResearch.Core.csproj>

现在,您可以根据需要自定义任何页面。例如,要自定义标准SectionA/PageA.cshtml,只需创建一个新的Pages/SectionA/PageA.cshtml文件。

└───Pages/
    └───SectionA/
        └───PageA.cshtml
        └───PageA.cshtml.cs
    └───SectionE/
        └───PageD.cshtml
        └───PageD.cshtml.cs
    └───Shared/
    └─── ...
└───WebApplication3.csproj