2009-04-13 38 views
14

Khi tạo đối tượng MailMessage bằng cách gọi phương thức "CreateMailMessage" trên lớp MailDefinition, tham số thứ ba là một đối tượng kiểu System.Web.UI.Control.Tại sao lớp MailDefinition yêu cầu 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,); 

Tại sao lại như vậy?
Và trong trường hợp tôi không có đối tượng thuộc loại đó, tôi nên vượt qua điều gì? Chỉ cần một đối tượng điều khiển mới?

Control control = new Control(); 

CẬP NHẬT

Tôi rất muốn khuyên bạn sử dụng Razor để xây dựng các mẫu email. Nó có cú pháp tuyệt vời, hoạt động tốt và không có bất kỳ phụ thuộc kỳ lạ nào!

+0

Tại sao bạn không sử dụng nhắn MailMessage = new MailMessage()? –

Trả lời

5

Thông thường bạn chỉ cần vượt qua this làm điều khiển.

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

Đối với lý do tại sao, here is what MSDN says:

Chủ sở hữu thông số chỉ ra mà kiểm soát là mẹ của sự kiểm soát MailDefinition. Nó xác định thư mục nào để tìm kiếm tệp văn bản được chỉ định trong thuộc tính BodyFileName.

+1

Và nếu tôi không chạy điều này từ trang ASPX, nhưng từ một lớp APP_CODE thì sao? –

+0

Sau đó, bạn cần chuyển tham chiếu đến điều khiển hiện tại vào mã đang tạo thư. –

0

Có vẻ như bạn có thể không cần sử dụng lớp MailDefinition nếu bạn không ràng buộc với bất kỳ điều khiển nào. Để chỉ cần gửi một email qua smtp, bạn nên sử dụng một System.Net.Mail.SmtpClient với một System.Net.Mail.MailMessage.

+8

Về cơ bản, tôi đang sử dụng lớp MailDefinition cho khả năng thay thế của nó. –

+0

Dao cạo IMO là phương pháp thực hành tốt nhất mới. –

1

Tôi đã sử dụng new LiteralControl() cho tham số thứ 3 vì thư của tôi đang được gửi từ Quy trình làm việc. Nó hoạt động. Nhưng tôi không có câu trả lời cho "Tại sao".

3

Các CreateMailMessage chức năng trong nội bộ sử dụng các quy định kiểm soát để truy vấn bất động sản AppRelativeTemplateSourceDirectoryOpenFile phương pháp của mình để đọc các nội dung của cơ thể (quy định tại các BodyFileName tài sản của MailDefinition) .

Dường như thiết kế kém và khớp nối chặt chẽ không cần thiết đối với tôi.

+2

Thật vậy! Nhưng với sự ra đời của động cơ Templating Razor, nó không thực sự quan trọng nữa: P http://razorengine.codeplex.com/ trong trường hợp bạn đã sống dưới một tảng đá :) –

+0

@JohnBubriski Tôi có thể sử dụng *** không RazorEngine *** trong ứng dụng _ASP.NET_ ** WebForms **? – Kiquenet

2

Bạn cũng có thể chỉ làm điều này:

MailMessage message = this.Mail.CreateMailMessage("[email protected]", dictionary, new System.Web.UI.Control()); 
Các vấn đề liên quan