【问题标题】:How to extend Razor Pages如何扩展 Razor 页面
【发布时间】:2019-07-12 22:48:52
【问题描述】:

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

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

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

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

例如

项目A:

  • /页
    • /标准
      • /A 部分
        • 页面A
        • 页面B
    • /自定义
      • /E 节
        • 页面D

项目 B:

  • /页
    • /标准
      • /A 部分
        • 页面A
        • 页面B
    • /自定义
      • /P 节
        • 第K页

项目 C:

  • /页
    • /标准
      • /A 部分
        • 页面A
        • 页面B
    • /自定义
      • /第五节
        • PageJ

我的问题由此而生:我会在每个项目中实现扩展标准的可能性 剃刀页面,可能要重写一些端点(例如我想改变“onGet”的行为 方法)或创建一个新方法(如“onGetMyCustomGet”)。

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

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

问题是:如何才能返回标准 razor page cshtml 而不是 fakeRazorPage cshtml?有可能吗?

在这里,您将找到一个示例项目https://github.com/Blackleones/RazorPageResearch,如果您想合作,请随时发送拉取请求。

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

【问题讨论】:

    标签: c# razor asp.net-core


    【解决方案1】:

    您不必到处复制和粘贴标准页面的源代码。只需创建一个单独的 Razor 类库项目并在您的项目 A/项目 B/项目 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
    

    【讨论】:

    • 谢谢 ItMinus,您的解决方案几乎完全解决了我的问题,但仍然是一个细节:我想扩展 PageModel 行为而不创建另一个 cshtml。我的意思是创建另一个 PageModel 来自定义标准行为,但 cshtml 视图仍然是标准。使用您的解决方案,我可以扩展 PageModel 行为,但我失去了 cshtml 标准,因此新的 cshtml 页面为空。我想做的是在控制器上模拟 [Route("myRoute", Order = 1)],其中只有标准行为定义要渲染的视图
    • @LeonardoLurci 我不确定哪里有办法做到这一点。但由于OnGet()/OnPost() 方法返回IActionResult,我想也许我们可以返回View(path_to_view) 或其他东西来获得标准视图。我不知道这是否可能。一旦我回到我的电脑,我会尝试它,如果它可以工作,我会更新你。
    • @LeonardoLurci 我试过了,但如果你想重复使用它们,我能想到的最简单的方法是复制相同的 .cshtml 视图文件。
    • 我找到了另一种无需重新创建另一个 .cshtml 即可自定义标准 pageModel 的解决方案。请参阅“custom_no_RCL”分支。我创建了 CustomPageA.cs 类并在 PageA.cshtml 中设置了@model CustomPageA,所以当我调用“/standard/PageA”时,它后面的 pageModel 是 CustomPageA。通过这种方式,我可以自定义 pageModel 行为而无需创建另一个 cshtml。
    • @LeonardoLurci 但是这样你仍然需要将“标准”页面复制并粘贴到每个项目中。更糟糕的是,当您有多个“标准”页面和多个项目时。
    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2012-08-23
    • 2016-06-04
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多