2009-04-13 3 views
14

При создании объекта MailMessage, вызвав метод CreateMailMessage в классе MailDefinition, третьим параметром является объект типа 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 control = new Control(); 

UPDATE

Я настоятельно рекомендую использовать Razor для создания шаблонов электронной почты. Он имеет отличный синтаксис, отлично работает и не имеет каких-либо странных зависимостей!

+0

Почему вы не используете MailMessage сообщение = новый MailMessage()? –

ответ

5

Обычно вы просто проходите this в качестве контроля.

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

Что касается причины, почему, here is what MSDN says:

Параметр Владелец указывает, какой контроль является родительским контролем MailDefinition. Он определяет, какой каталог ищет текстовый файл, указанный в свойстве BodyFileName.

+1

А что, если я не запускаю это с ASPX-страницы, но из класса APP_CODE? –

+0

Затем вам нужно передать ссылку на текущий элемент управления в код, который создает почтовое сообщение. –

0

Похоже, что вам необязательно использовать класс MailDefinition вообще, если вы не привязываетесь к каким-либо элементам управления. Чтобы просто отправить сообщение по smtp, вы должны использовать System.Net.Mail.SmtpClient с System.Net.Mail.MailMessage.

+8

В основном, я использую класс MailDefinition для его возможностей замены. –

+0

Razor engine IMO - новый способ передовой практики. –

1

Я использовал new LiteralControl() для 3-го параметра, потому что мои сообщения отправляются из Workflow. Оно работает. Но у меня нет ответа на вопрос «Почему».

3

CreateMailMessage функция внутренне использует указанный Control для запроса его свойства AppRelativeTemplateSourceDirectory и его OpenFile метода, чтобы прочитать содержимое тела (указанное в BodyFileName свойства MailDefinition) ,

Кажется, плохая конструкция и ненужная плотная муфта для меня.

+2

Действительно! Но с появлением мотора шаблонов Razor это уже не имеет значения: P http://razorengine.codeplex.com/, если вы живете под скалой :) –

+0

@JohnBubriski Могу ли я использовать *** RazorEngine *** в приложении _ASP.NET_ ** WebForms **? – Kiquenet

2

Вы также можете просто сделать это:

MailMessage message = this.Mail.CreateMailMessage("[email protected]", dictionary, new System.Web.UI.Control()); 
Смежные вопросы