2009-04-13 104 views
14

通过调用MailDefinition类上的“CreateMailMessage”方法创建MailMessage对象时,第三个参数是System.Web.UI.Control类型的对象。为什么MailDefinition类需要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 = "[email protected]"; 
mail.Subject = "Hello"; 

MailMessage message = mail.CreateMailMessage("[email protected],", replacements,); 

这是为什么?
而在我没有这种类型的对象的情况下,我应该通过什么呢?只是一个新的控制对象?

Control control = new Control(); 

UPDATE

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

+0

你为什么不MAILMESSAGE使用消息= MAILMESSAGE新()? – 2009-04-13 14:53:59

回答

5

通常你只要通过this作为控件。

MailMessage message = mail.CreateMailMessage("[email protected],", replacements, this); 

至于为什么here is what MSDN says:

雇主参数指示的原因,其控制是MailDefinition控件的父。它确定要搜索BodyFileName属性中指定的文本文件的目录。

+1

如果我不是从ASPX页面运行而是从APP_CODE类运行,该怎么办? – 2009-04-13 14:56:44

+0

然后,您需要将对当前控件的引用传递到正在创建邮件消息的代码中。 – 2009-04-13 15:00:01

0

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

+8

基本上,我使用MailDefinition类来替换它的功能。 – 2009-04-13 15:08:28

1

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

3

CreateMailMessage函数在内部使用指定控制查询其AppRelativeTemplateSourceDirectory属性及其的OpenFile方法读取所述主体(在MailDefinitionBodyFileName属性中指定)的内容。

似乎不好的设计和不必要的紧密耦合对我来说。

2

你也可以这样做:

MailMessage message = this.Mail.CreateMailMessage("[email protected]", dictionary, new System.Web.UI.Control());