2012-01-13 26 views
5

Tôi đang xây dựng một ứng dụng sẽ gửi email tùy chỉnh tới người dùng cuối.Quay lại ASP.NET MVC Xem dưới dạng Tệp HTML để sử dụng trong Mẫu email

Tôi đã xây dựng một mẫu HTML mà từ đó các email sẽ được tạo.

Tôi hiện đang có các mẫu điền với các thẻ như placeholders về nội dung tùy chỉnh ...

|Text-Placeholder| 

Tôi đã được trở về file html như một chuỗi Phương pháp CreateEMail tôi:

string html = System.IO.File.ReadAllText(Server.MapPath("~/EmailTemplates/emailTemplate.html")); 

Và sau đó sử dụng String.Replace để thay thế trong văn bản/nội dung tùy chỉnh

html = html.Replace("|Name-Placeholder|", username); 

Tôi tò mò nếu có một phương pháp cho phép tôi xây dựng mẫu như RazorView được đánh máy mạnh mẽ như một ViewModel sẽ mô hình văn bản/nội dung tùy chỉnh và trả về dạng xem dưới dạng tệp HTML hoặc trực tiếp dưới dạng chuỗi để chuyển vào tài sản cơ thể của cá thể SMTPClient của tôi để gửi cho người dùng?

Có ai đã thực hiện điều gì đó tương tự không?

+0

bản sao có thể có của [Hiển thị chế độ xem dưới dạng chuỗi] (http: //stackoverflow.com/questions/483091/render-a-view-as-a-string) – jrummell

+1

Nhận xét trong đề xuất trùng lặp đề cập đến phương pháp đó không hoạt động trong MVC 3 và "Cách tốt hơn để đồng hành với điều này ngay bây giờ" – stephen776

Trả lời

10

Hãy xem các thư viện này:

Có ActionMailer. Lấy cảm hứng từ ActionMailer của Ruby.

ActionMailer.Net là một cách dễ dàng và tương đối dễ dàng để gửi email từ ứng dụng ASP.NET MVC của bạn. Khái niệm khá là đơn giản. Chúng tôi kết xuất HTML bằng cách sử dụng một số công cụ xem khá hấp dẫn, vậy tại sao chúng ta không thể làm điều tương tự cho email?

http://nuget.org/packages/ActionMailer

Hỗ trợ nhiều công cụ xem tôi nghĩ, Razor bao gồm các khóa học. Và cho phép bạn chuyển một mô hình vào khung nhìn. Xem: https://bitbucket.org/swaj/actionmailer.net/wiki/Home

Mã:

public class MailController : MailerBase 
{ 
    public EmailResult VerificationEmail(User model) 
    { 
     To.Add(model.EmailAddress); 
     From = "[email protected]"; 
     Subject = "Welcome to My Cool Site!"; 
     return Email("VerificationEmail", model); 
    } 
} 

Quan điểm:

@using ActionMailer.Net 
@model User 
@{ 
    Layout = null; 
} 
Welcome to My Cool Site, @Model.FirstName. We need you to verify your email. 
Click this nifty link to get verified! 

Ngoài ra còn có một thư viện:

MvcMailer phép bạn sử dụng xem MVC của bạn để tạo ra cảnh quan tuyệt đẹp email

http://nuget.org/packages/MvcMailer
https://github.com/smsohan/MvcMailer

+0

Rất vui khi được trợ giúp. Tôi đã làm hỏng các liên kết và mô tả một chút! Đã chỉnh sửa câu trả lời ngay bây giờ. – gideon

0

bạn có thể sử dụng helper này để loại bỏ các Html từ một View. Phương thức cũng chấp nhận một mô hình, View được lập trình trả về và đầu ra của nó được trả về dưới dạng một chuỗi.Nhiều quặng ít các khái niệm tương tự của LoadControl in Asp.net:

public static string RenderPartialToString(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData) 
{ 
    var viewEngineResult = ViewEngines.Engines.FindPartialView(context, partialViewName); 

    if (viewEngineResult.View != null) 
    { 
     var stringBuilder = new StringBuilder(); 
     using (var stringWriter = new StringWriter(stringBuilder)) 
     { 
      using (var output = new HtmlTextWriter(stringWriter)) 
      { 
       ViewContext viewContext = new ViewContext(context, viewEngineResult.View, viewData, tempData, output); 
       viewEngineResult.View.Render(viewContext, output); 
      } 
     } 

     return stringBuilder.ToString(); 
    } 

    //return string.Empty; 
    throw new FileNotFoundException("The view cannot be found", partialViewName); 
} 

Đây là nơi mà nội dung của quan điểm được lấy

//The welcome email is in the Shared/Email folder 
string partialViewHtml = EmailHelpers.RenderPartialToString(this.ControllerContext, "Email/Welcome", new ViewDataDictionary(modelForPartialView), new TempDataDictionary()); 
0

vấn đề với tất cả các giải pháp trên được rằng họ không phải là thread an toàn !.

nếu bạn muốn hiển thị chế độ xem từ một chuỗi khác thì sao? (Cho thư điện tử)
trong trường hợp đó ControllerContext là không còn phù hợp cũng không phải này Controller

cho những trường hợp này tôi đề nghị các giải pháp sau đây:

ThreadPool.QueueUserWorkItem(_ => 
{ 
    var model = new TestMailModel() { Sender = "yakirmanor", Recipient = "[email protected]", Description = "some desc" }; 
    string test1 = ControllerExtensions.RenderView("Mail", "TestMail", model); 
    string test2 = this.RenderView("TestMail", model); 
    string test3 = this.RenderView(model); 
    // now send the mail 
    //MailHelper.SendEmail("[email protected]", "subject", test1, "username", "password"); 
}); 

đây bạn có thể thấy tôi gọi TestMail trong bộ điều khiển Mail và cũng là TestMail trong bộ điều khiển hiện tại.
để tạo ra các extansions

public static class ControllerExtensions 
{ 
    public static string RenderView(this Controller controller, object model) 
    { 
     string viewName = controller.ControllerContext.RouteData.Values["action"].ToString(); 
     string controllerName = controller.ControllerContext.RouteData.Values["controller"].ToString(); 
     return RenderView(controllerName, viewName, model); 
    } 

    public static string RenderView(this Controller controller, string viewName, object model) 
    { 
     string controllerName = controller.ControllerContext.RouteData.Values["controller"].ToString(); 
     return RenderView(controllerName, viewName, model); 
    } 

    public static string RenderView(string controllerName, string viewName, object viewData) 
    { 
     //Create memory writer 
     var writer = new StringWriter(); 

     var routeData = new RouteData(); 
     routeData.Values.Add("controller", controllerName); 

     //Create fake http context to render the view 
     var fakeRequest = new HttpRequest(null, "http://tempuri.org", null); 
     var fakeResponse = new HttpResponse(null); 
     var fakeContext = new HttpContext(fakeRequest, fakeResponse); 
     var fakeControllerContext = new ControllerContext(new HttpContextWrapper(fakeContext), routeData, new FakeController()); 

     var razorViewEngine = new RazorViewEngine(); 
     var razorViewResult = razorViewEngine.FindView(fakeControllerContext,viewName,"",false); 

     var viewContext = new ViewContext(fakeControllerContext, razorViewResult.View, new ViewDataDictionary(viewData), new TempDataDictionary(), writer); 
     razorViewResult.View.Render(viewContext, writer); 

     return writer.ToString(); 
    } 
} 

sử dụng mã bạn cần phải thêm mô hình của bạn và bộ điều khiển giả

public class TestMailModel 
{ 
    public string Sender { get; set; } 
    public string Recipient { get; set; } 
    public string Description { get; set; } 
} 

class FakeController : ControllerBase 
{ 
    protected override void ExecuteCore() { } 
} 

quan điểm có thể trông giống như vậy:

@model Phytech.PhyToWeb.Controllers.TestMailModel 
@{ 
Layout = null; 
} 
<table cellpadding="8" cellspacing="0" style="width: 100%!important; background: #ffffff; margin: 0; padding: 0" border="0"> 
    <tbody><tr><td valign="top"> 
    Hi @Model.Recipient youve got mail from @Model.Sender about @Model.Description 
    </td></tr></tbody> 
</table> 
0

như một gợi ý nhỏ, thay vì giữ chỗ, sử dụng tài nguyên. bạn tạo một tệp tài nguyên, nói trong thư mục ~/Content của bạn có tên là EMail.resx và thêm mã thông báo của bạn vào nó. theo quan điểm, bạn có thể tham khảo họ như thế này @EMail.Name@EMail.Address. lợi ích là nếu ngày mai bạn cần gửi thư bằng tiếng Pháp, bạn tạo một EMail.fr.resx với tất cả các mã thông báo tương tự và bạn đã hoàn thành

Các vấn đề liên quan