如何在RazorEngine中使用命名空间帮助函数?

时间:2018-09-25 00:52:42

标签: c# asp.net razor 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.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发挥作用吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

    @helper PlaceAd() {     广告 }

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

  • 从Web应用程序引用此新dll。

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

  • 利润

答案 1 :(得分:0)

我建议将您的“帮助器”文件夹下的代码移至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