为啥 MailDefinition 类需要 System.Web.UI.Control?

Posted

技术标签:

【中文标题】为啥 MailDefinition 类需要 System.Web.UI.Control?【英文标题】:Why does the MailDefinition class require a System.Web.UI.Control?为什么 MailDefinition 类需要 System.Web.UI.Control? 【发布时间】:2010-10-19 03:36:45 【问题描述】:

通过调用 MailDefinition 类的“CreateMailMessage”方法创建 MailMessage 对象时,第三个参数是 System.Web.UI.Control 类型的对象。

MailDefinition mail = new MailDefinition();

ListDictionary replacements = new ListDictionary();
replacements.Add("<%myname%>", "John");

mail.BodyFileName = "~/App_Data/Emails/SomeEmail.txt";
mail.From = "me@example.com";
mail.Subject = "Hello";

MailMessage message = mail.CreateMailMessage("example@example.com,", replacements, );

为什么会这样? 如果我没有那种类型的对象,我应该传递什么?只是一个新的 Control 对象?

Control control = new Control();

更新

我强烈建议使用Razor 来构建电子邮件模板。它有很好的语法,很好用,而且没有任何奇怪的依赖!

【问题讨论】:

你为什么不使用 MailMessage message = new MailMessage()? 【参考方案1】:

通常您只需将this 作为控件传递。

MailMessage message = mail.CreateMailMessage("example@example.com,", replacements, this);

至于原因,here is what MSDN says:

owner 参数指示哪个控件是 MailDefinition 控件的父级。它确定在哪个目录中搜索 BodyFileName 属性中指定的文本文件。

【讨论】:

如果我不是从 ASPX 页面运行,而是从 APP_CODE 类运行呢? 那么您需要将当前控件的引用传入创建邮件消息的代码中。【参考方案2】:

如果您没有绑定到任何控件,听起来您可能根本不需要使用 MailDefinition 类。要简单地通过 smtp 发送电子邮件,您应该使用 System.Net.Mail.SmtpClient 和 System.Net.Mail.MailMessage。

【讨论】:

基本上,我使用 MailDefinition 类来替代它。 Razor engine IMO 是新的最佳实践方式。【参考方案3】:

我一直使用new LiteralControl() 作为第三个参数,因为我的消息是从工作流发送的。有用。但我没有“为什么”的答案。

【讨论】:

【参考方案4】:

CreateMailMessage 函数内部使用指定的Control 来查询其AppRelativeTemplateSourceDirectory 属性及其OpenFile 方法来读取正文的内容(在 MailDefinitionBodyFileName 属性中指定)。

对我来说,这似乎是糟糕的设计和不必要的紧密耦合。

【讨论】:

确实!但是随着 Razor 模板引擎的出现,它不再重要了 :P razorengine.codeplex.com 以防你一直生活在一块石头下:) @JohnBubriski 我可以在 ASP.NET WebForms 应用程序中使用 RazorEngine 吗? 【参考方案5】:

你也可以这样做:

MailMessage message = this.Mail.CreateMailMessage("no-reply@example.com", dictionary, new System.Web.UI.Control());

【讨论】:

以上是关于为啥 MailDefinition 类需要 System.Web.UI.Control?的主要内容,如果未能解决你的问题,请参考以下文章

为啥一开机就出现提示 需要smartcardReader installation disk #1上的文件usbick sys

为啥某些 Linux x86_64 系统调用需要存根?

为啥 Python 3 的 'sys.modules' 中没有导入的模块?

为啥 sys.stdout.write 被调用两次?

为啥没有 cdirent 或 sys/cstat

为啥Android中的文件'/sys/power/state'总是'mem'?