2009-04-13 22 views
14

MailDefinitionクラスの "CreateMailMessage"メソッドを呼び出してMailMessageオブジェクトを作成する場合、3番目のパラメータは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

? –

答えて

5

通常、コントロールとしてthisを渡すだけです。 MailDefinitionコントロールの親である制御here is what MSDN says:

ownerパラメータが示す理由、理由として

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

。 BodyFileNameプロパティで指定されたテキストファイルを検索するディレクトリを決定します。

+1

これをASPXページからではなく、APP_CODEクラスから実行している場合はどうなりますか? –

+0

次に、現在のコントロールへの参照を、メールメッセージを作成するコードに渡す必要があります。 –

0

コントロールにバインドしていない場合は、MailDefinitionクラスをまったく使用する必要はないようです。 smtp経由で電子メールを送信するには、System.Net.Mail.SmtMessageとともにSystem.Net.Mail.SmtpClientを使用する必要があります。

+8

基本的に、私はMailDefinitionクラスをその置換能力のために使用しています。 –

+0

RazorエンジンIMOは新しいベストプラクティス方法です。 –

1

メッセージがワークフローから送信されているため、私は第3パラメータにnew LiteralControl()を使用しています。できます。しかし、私は "なぜ"の答えがありません。

3

CreateMailMessage関数は、内部(MailDefinitionBodyFileNameプロパティで指定された)本体の内容を読み取るために、そのAppRelativeTemplateSourceDirectory性及びそののOpenFile方法を照会するために指定コントロールを使用。

私にとってデザインが不十分で、タイトなカップリングが不要です。

+2

確かに!しかし、Razorのテンプレートエンジンの登場により、それはもはや重要ではありません:P http://razorengine.codeplex.com/あなたがロックの下に住んでいた場合のために:) –

+0

@JohnBubriski RazorEngine *** in _ASP.NET_ ** WebForms **アプリケーション? – Kiquenet

2

また、単にこれを行うことができます:なぜあなたは)(はMailMessageメッセージ=新しいはMailMessageを使用していない

MailMessage message = this.Mail.CreateMailMessage("no-[email protected]", dictionary, new System.Web.UI.Control()); 
関連する問題