2009-04-13 26 views
14

Beim Erstellen eines MailMessage-Objekts durch Aufrufen der Methode "CreateMailMessage" für die MailDefinition-Klasse ist der dritte Parameter ein Objekt vom Typ System.Web.UI.Control.Warum benötigt die MailDefinition-Klasse ein 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,); 

Warum ist das?
Und in dem Fall, dass ich kein Objekt dieses Typs habe, was sollte ich stattdessen bestehen? Nur ein neues Control-Objekt?

Control control = new Control(); 

UPDATE

Ich würde mit Razor empfehlen E-Mail-Vorlagen zu bauen. Es hat eine großartige Syntax, funktioniert super und hat keine seltsamen Abhängigkeiten!

+0

Warum sind Sie nicht Mailmessage Nachricht = new Mailmessage() verwenden? –

Antwort

5

Normalerweise übergeben Sie einfach this als Steuerelement.

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

Als Grund, warum here is what MSDN says:

Der Inhaber Parameter, ist die Mutter der Maildefinition Steuer steuern anzeigt. Es legt fest, in welchem ​​Verzeichnis nach der in der Eigenschaft BodyFileName angegebenen Textdatei gesucht werden soll.

+1

Und was, wenn ich das nicht von einer ASPX-Seite, sondern von einer APP_CODE-Klasse aus führe? –

+0

Dann müssen Sie einen Verweis auf das aktuelle Steuerelement in den Code übergeben, der die E-Mail-Nachricht erstellt. –

0

Es klingt, als ob Sie die MailDefinition-Klasse überhaupt nicht verwenden müssen, wenn Sie keine Steuerelemente binden. Um einfach eine E-Mail über SMTP zu senden, sollten Sie einen System.Net.Mail.SmtpClient mit einer System.Net.Mail.MailMessage verwenden.

+8

Grundsätzlich verwende ich die MailDefinition-Klasse für ihre Ersatzfähigkeiten. –

+0

Razor Motor IMO ist der neue Best-Practice-Weg. –

1

Ich habe new LiteralControl() für den 3. Parameter verwendet, weil meine Nachrichten von einem Workflow gesendet werden. Es klappt. Aber ich habe keine Antwort für "Warum".

3

Die CreateMailMessage Funktion intern verwendet die angegebene Steuerung seine AppRelativeTemplateSourceDirectory Eigenschaft und seine Openfile Verfahren zur Abfrage des Inhalt des Körpers (angegeben in der BodyFileName Eigenschaft der Maildefinition) zu lesen, .

Scheint schlechtes Design und unnötig enge Kopplung für mich.

+2

In der Tat! Aber mit dem Aufkommen der Razor Templating-Engine spielt es eigentlich keine Rolle mehr: P http://razorengine.codeplex.com/ falls du unter einem Stein gelebt hast :) –

+0

@JohnBubriski Kann ich benutzen *** RazorEngine *** in _ASP.NET_ ** WebForms ** -Anwendung? – Kiquenet

2

Sie können auch dies nur tun:

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