【问题标题】:How can I use namespaced helper functions in RazorEngine?如何在 RazorEngine 中使用命名空间辅助函数?
【发布时间】:2019-02-28 13:04:28
【问题描述】:

我正在使用 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.Resize@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.net razor razorengine


【解决方案1】:

Razor 页面被编译成简单的类,而助手成为这些类的方法,因此您不能将它们放在命名空间下。

但是,如果您不介意将 cshtml 文件放在不同的类库项目中,则可以使用名为“Razor Generator”的扩展。

  • 从“扩展和更新”安装“剃须刀生成器”。
  • 重新启动 Visual Studio 并打开您的 Web 项目。
  • 添加一个新的类库项目。
  • 将新的 cshtml(例如 Ads.cshtml)文件添加到最近创建的项目中。
  • 在文件的第一行写入以下文本。

    @* 生成器:MvcHelper GeneratePrettyNames : true *@

  • 在文件中放置一些关键业务代码

    @helper PlaceAd() { 广告 }

  • 在文件属性中,将“自定义工具”设置为“RazorGenerator”,并将“自定义工具命名空间”设置为您想要的命名空间

  • 从 Web 应用程序引用这个新的 dll。

  • 从任何角度引用您的新业务关键助手

  • 利润

【讨论】:

【解决方案2】:

我建议将 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>

欲了解更多信息,您可以访问此link

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多