我应该在 ASP.NET MVC 项目中的什么地方放置共享 HTML 生成代码?
Where should I put shared HTML generation code in an ASP.NET MVC project?
我有一个 ASP.NET MVC 解决方案,我在 ASP.NET MVC 项目中有大量的 HtmlHelper 类,它们获取数据并生成 html 显示在不同的页面上。
我现在必须 运行 一堆预定的作业,其中许多作业都会生成电子邮件。我将所有这些工作移到了解决方案中的一个单独项目中(称为 AdminJob.csproj),但我现在发现我必须生成一些与我在视图页面中非常相似的 HTML 的电子邮件.我试图让管理工作不依赖于 ASP.NET MVC 项目(如果需要,我想 运行 adminjob 项目作为命令行),我也想避免拥有我的 ASP.NET MVC 项目依赖于 AdminJob 项目(因为这看起来很奇怪)。
关于如何避免在我的 ASP.NET MVC 项目和我的 AdminJob 项目中重复相同的 HTML 渲染代码有什么建议吗?
我唯一能想到的是在名为 "ViewHelpers" 的解决方案中创建另一个项目或类似的东西,然后将我所有的 HTMLHelpers 移动到该项目中,以便两者都可以引用我的 MVC 项目和 AdminJob 项目。只为这段代码创建一个单独的项目似乎有点矫枉过正,但我想不出另一种不会产生重复的解决方案。
对于执行此操作并避免任何重复的更好方法还有其他建议吗?
我的看法是电子邮件是一个视图 type.There 是我的网络应用程序中的几种视图类型(html、电子邮件、pdf、rss 等)。这种模式有几种实现方式:ActionMailer in ruby on rails or its port to asp.net: MvcMailer.
通过这种方式,您可以在 Web 应用程序和电子邮件中充分利用 Razor 引擎,以减少重复。
您可以在另一个项目中托管您的视图,并通知您的 ViewEngine 在哪里寻找视图(请参阅 Views in separate assemblies in ASP.NET MVC)。我觉得这太过分了。
另一种方法——我使用的方法——是将电子邮件模板与其他视图放在同一个项目中。
如果您想在 Web 应用程序之外呈现视图,您可以使用以下之一在控制台应用程序中编译 Razor 模板:
- Razor 模板:https://github.com/volkovku/RazorTemplates
- 剃刀引擎:https://github.com/Antaris/RazorEngine
- 使用 MvcMailer 之类的东西,您可以在计划的任务中发出 curl 请求。 MvcMailer 需要 运行 的 HttpContext,因此您无法从控制台应用程序 运行 它。卷曲 mvc 操作将起作用。
不要完全排除让 AdminJob 依赖于网站的想法。这可能对您有用:How to use Razor View Engine in a console application?。
请注意,compile-time 依赖于 MVC 项目的 AdminJob 不会 阻止 AdminJob 运行 作为控制台应用程序。那可以正常工作。
我预料到的问题 — 即使您将 View-related 内容移到共享项目中 — 您可能会发现它在 运行 时间 运行 时全部中断在网站之外。在幕后,依赖于 System.Web
东西,例如HttpContext
,在 运行 时将为空。有些依赖可以存根,有些则不能。
在一个单独的共享项目中根本无法解决这个问题,所以我不认为移动代码有任何好处。
但这里的典型方法(即我工作过的最后 6 家公司中的 5 家)是:
忘了命令行的想法。使管理工具成为网站的一部分。无论您想从命令行 运行 执行什么,都可以通过管理工具上的按钮 运行 执行。
PS
“与我的页面非常相似 HTML 的电子邮件”是一个你应该剪掉的结。
与视图页面相同,在这种情况下,您希望 AdminJob 重用视图页面;或者不是。在这种情况下,AdminJob 应该有自己的 HTML。在第二种情况下,采取没有 'similar' HTML 之类的行;不一样就是不一样
我理解将 html 从常规网站页面重用到您的电子邮件引擎中的诱惑。但是,我认为这是 over-engineering 的一个很好的例子。这将造成比 short-run.
更多的限制 long-run
想想两件事:
电子邮件的 HTML 与页面的 HTML 设计不同。即使今天它们看起来很相似,但明天它们看起来会有所不同。你刚才说了 - 'email with very similar HTML as i have in my view pages',你没说 'with exact same HTML'.
电子邮件的 HTML 不应包含任何高级 HTML 或任何 JavaScript。理想情况下,它应该有内联 CSS 而没有 JavaScript。 CSS 与电子邮件客户端的兼容非常有限。标记规则不同于为常规浏览器编写标记规则的自然和现代方式。一个很好的例子是电子邮件客户端对表格很友好,而在现代网络中你现在很少使用表格,特别是如果你想保持响应(cross-screen-platform-browser)。在此处阅读所有限制:email-standards.org
HTML 现代网络不必像电子邮件那样静态。
这些都是流行的在线商业电子邮件发件人背后的想法。他们帮助您创建电子邮件分发列表,并且他们为生成适当的限制 HTML 而头疼。否则,它们会存在吗?如果不是标记差异,任何人都可以发送群组电子邮件。
我从这一切得出的结论:如果您决定将网页标记用于电子邮件,那么您就限制了两者。你是over-engineering。如果您不在电子邮件中重复使用常规页面标记,事情会简单得多。我知道他们今天很相似,但明天可能就不一样了。
显然,为您的电子邮件引擎提供模板功能是个好主意(与重用网页标记无关)。为此,您可以使用任何现有的模板引擎,或者您可以快速编写自己的模板引擎(毕竟,如果您将 HTML 消息模板作为字符串加载,脏 string.Replace() 将用值替换占位符来自文件或数据库)。
换句话说,直接回答你的问题:不要犹豫,将网页和邮件两条路径分开。避免共享功能,因为它们大多不同。将两者与 each-other.
分开考虑
我有一个 ASP.NET MVC 解决方案,我在 ASP.NET MVC 项目中有大量的 HtmlHelper 类,它们获取数据并生成 html 显示在不同的页面上。
我现在必须 运行 一堆预定的作业,其中许多作业都会生成电子邮件。我将所有这些工作移到了解决方案中的一个单独项目中(称为 AdminJob.csproj),但我现在发现我必须生成一些与我在视图页面中非常相似的 HTML 的电子邮件.我试图让管理工作不依赖于 ASP.NET MVC 项目(如果需要,我想 运行 adminjob 项目作为命令行),我也想避免拥有我的 ASP.NET MVC 项目依赖于 AdminJob 项目(因为这看起来很奇怪)。
关于如何避免在我的 ASP.NET MVC 项目和我的 AdminJob 项目中重复相同的 HTML 渲染代码有什么建议吗?
我唯一能想到的是在名为 "ViewHelpers" 的解决方案中创建另一个项目或类似的东西,然后将我所有的 HTMLHelpers 移动到该项目中,以便两者都可以引用我的 MVC 项目和 AdminJob 项目。只为这段代码创建一个单独的项目似乎有点矫枉过正,但我想不出另一种不会产生重复的解决方案。
对于执行此操作并避免任何重复的更好方法还有其他建议吗?
我的看法是电子邮件是一个视图 type.There 是我的网络应用程序中的几种视图类型(html、电子邮件、pdf、rss 等)。这种模式有几种实现方式:ActionMailer in ruby on rails or its port to asp.net: MvcMailer.
通过这种方式,您可以在 Web 应用程序和电子邮件中充分利用 Razor 引擎,以减少重复。
您可以在另一个项目中托管您的视图,并通知您的 ViewEngine 在哪里寻找视图(请参阅 Views in separate assemblies in ASP.NET MVC)。我觉得这太过分了。
另一种方法——我使用的方法——是将电子邮件模板与其他视图放在同一个项目中。
如果您想在 Web 应用程序之外呈现视图,您可以使用以下之一在控制台应用程序中编译 Razor 模板:
- Razor 模板:https://github.com/volkovku/RazorTemplates
- 剃刀引擎:https://github.com/Antaris/RazorEngine
- 使用 MvcMailer 之类的东西,您可以在计划的任务中发出 curl 请求。 MvcMailer 需要 运行 的 HttpContext,因此您无法从控制台应用程序 运行 它。卷曲 mvc 操作将起作用。
不要完全排除让 AdminJob 依赖于网站的想法。这可能对您有用:How to use Razor View Engine in a console application?。
请注意,compile-time 依赖于 MVC 项目的 AdminJob 不会 阻止 AdminJob 运行 作为控制台应用程序。那可以正常工作。
我预料到的问题 — 即使您将 View-related 内容移到共享项目中 — 您可能会发现它在 运行 时间 运行 时全部中断在网站之外。在幕后,依赖于 System.Web
东西,例如HttpContext
,在 运行 时将为空。有些依赖可以存根,有些则不能。
在一个单独的共享项目中根本无法解决这个问题,所以我不认为移动代码有任何好处。
但这里的典型方法(即我工作过的最后 6 家公司中的 5 家)是:
忘了命令行的想法。使管理工具成为网站的一部分。无论您想从命令行 运行 执行什么,都可以通过管理工具上的按钮 运行 执行。
PS
“与我的页面非常相似 HTML 的电子邮件”是一个你应该剪掉的结。
与视图页面相同,在这种情况下,您希望 AdminJob 重用视图页面;或者不是。在这种情况下,AdminJob 应该有自己的 HTML。在第二种情况下,采取没有 'similar' HTML 之类的行;不一样就是不一样
我理解将 html 从常规网站页面重用到您的电子邮件引擎中的诱惑。但是,我认为这是 over-engineering 的一个很好的例子。这将造成比 short-run.
更多的限制 long-run想想两件事:
电子邮件的HTML 与页面的 HTML 设计不同。即使今天它们看起来很相似,但明天它们看起来会有所不同。你刚才说了 - 'email with very similar HTML as i have in my view pages',你没说 'with exact same HTML'.
电子邮件的HTML 不应包含任何高级 HTML 或任何 JavaScript。理想情况下,它应该有内联 CSS 而没有 JavaScript。 CSS 与电子邮件客户端的兼容非常有限。标记规则不同于为常规浏览器编写标记规则的自然和现代方式。一个很好的例子是电子邮件客户端对表格很友好,而在现代网络中你现在很少使用表格,特别是如果你想保持响应(cross-screen-platform-browser)。在此处阅读所有限制:email-standards.org
HTML 现代网络不必像电子邮件那样静态。
这些都是流行的在线商业电子邮件发件人背后的想法。他们帮助您创建电子邮件分发列表,并且他们为生成适当的限制 HTML 而头疼。否则,它们会存在吗?如果不是标记差异,任何人都可以发送群组电子邮件。
我从这一切得出的结论:如果您决定将网页标记用于电子邮件,那么您就限制了两者。你是over-engineering。如果您不在电子邮件中重复使用常规页面标记,事情会简单得多。我知道他们今天很相似,但明天可能就不一样了。
显然,为您的电子邮件引擎提供模板功能是个好主意(与重用网页标记无关)。为此,您可以使用任何现有的模板引擎,或者您可以快速编写自己的模板引擎(毕竟,如果您将 HTML 消息模板作为字符串加载,脏 string.Replace() 将用值替换占位符来自文件或数据库)。
换句话说,直接回答你的问题:不要犹豫,将网页和邮件两条路径分开。避免共享功能,因为它们大多不同。将两者与 each-other.
分开考虑