首页 > 解决方案 > 如何在 RazorEngine 中使用命名空间辅助函数?

问题描述

我正在使用 RazorEngine 构建电子邮件模板系统,并希望在与我的主模板不同的 cshtml 文件中维护辅助函数。例如,假设我有一个这样的文件夹结构:

/Templates
    Support.cshtml
    Registration.cshtml
    Marketing.cshtml
/Helpers
    /Shared
        Common.cshtml
        Images.cshtml
    /Marketing
        Ads.cshtml
        Products.cshtml

我想要的是模板像这样访问助手:

<body>
    @Common.Header()
    <img src="@Images.Resize(@Model.ImageUrl)" />
</body>

但我希望它们命名空间的原因是因为我想说广告团队能够编写和维护助手,而不必担心与普通助手或任何其他团队的命名冲突。他们可以自信地命名一个助手Resize()而不用担心,@Images.Resize因为他们的助手会被访问为@Ads.Resizeor @Marketing.Ads.Resize()

根据帮助程序在 Razor 的本机实现中的工作方式,这似乎有点可能(https://docs.microsoft.com/en-us/aspnet/web-pages/overview/ui-layouts-and-themes/creating-and- using-a-helper-in-an-aspnet-web-pages-site)但我们的代码库是分布式的,因此没有 App_Code 文件夹,而且 RazorEngine 在很多方面都不同,所以我没能让它工作。

现在我一直在通过使用字符串连接让我的助手进入模板,这似乎也是错误的,那么有没有办法可以使用 RazorEngine 进行这项工作?

标签: c#asp.netrazorrazorengine

解决方案


我建议将 Helper 文件夹下的代码移动到 App_Code:
1. 右键单击​​您的项目(不是解决方案)> 添加 > 添加 ASP.NET 文件夹 > App_Code
2. 使用@helper语法创建模板:

@helper MakeNote(string content) {
  <div class="note" 
       style="border: 1px solid black; width: 90%; padding: 5px; margin-left: 15px;">
    <p>
      <strong>Note</strong>&nbsp;&nbsp; @content
    </p>
  </div>
}

3. 通过声明使用您之前创建的模板@MyHelpers.MakeNote("My test note content.")

<!DOCTYPE html>
  <head>
    <title>Test Helpers Page</title>
  </head>
  <body>
    <p>This is some opening paragraph text.</p>

    <!-- Insert the call to your note helper here. -->
    @MyHelpers.MakeNote("My test note content.")

    <p>This is some following text.</p>
  </body>
</html>

有关更多信息,您可以访问此链接


推荐阅读