我正在使用 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>
但我希望它们具有命名空间的原因是因为我想说 Ads 团队能够编写和维护 helpers 而不必担心与 common helpers 或任何其他团队的命名冲突。他们可以自信地将助手命名为 Resize()
而不必担心 @Images.Resize
因为他们的助手将被访问为 @Ads.Resize
或 @Marketing.Ads.Resize()
。
根据助手在 Razor (https://learn.microsoft.com/en-us/aspnet/web-pages/overview/ui-layouts-and-themes/creating-and-using-a-helper-in-an-aspnet-web-pages-site) 的 native 实现中的工作方式,这似乎有点可能,但我们的代码库是分布式的,因此没有 App_Code 文件夹,而且 RazorEngine 在很多方面都不同,所以我一直无法让它工作。
现在我一直在通过使用字符串连接让我的助手进入模板,这似乎也是错误的,那么有什么方法可以让我使用 RazorEngine 来完成这项工作吗?
最佳答案
Razor 页面被编译成简单的类,助手成为这些类的方法,因此您不能将它们放在命名空间下。
但是,如果您不介意将 cshtml 文件放在不同的类库项目中,则可以使用名为“Razor Generator”的扩展。
- 从“扩展和更新”安装“razor generator”。
- 重新启动 Visual Studio 并打开您的网络项目。
- 添加一个新的类库项目。
- 将新的 cshtml(例如 Ads.cshtml)文件添加到最近创建的项目中。
在文件的第一行写下以下文本。
@* 生成器:MvcHelper GeneratePrettyNames : true *@
在文件中放置一些业务关键代码
@helper PlaceAd() { 广告
在文件属性中,将“自定义工具”设置为“RazorGenerator”,并将“自定义工具命名空间”设置为您想要的命名空间
从 Web 应用程序引用这个新的 dll。
从任何 View 引用您的新业务关键助手
利润
关于c# - 如何在 RazorEngine 中使用命名空间辅助函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52489149/