2011-07-10 27 views
8

Tôi không biết nếu tôi giải thích điều này một cách chính xác, hoặc nếu là giải pháp khá đơn giản, vì vậy ở đây đi:MvcMailer: Lấy đầu vào sử dụng theo quan điểm thông qua mô hình và sau đó chèn nó vào email

Tôi đang sử dụng MvcMailer , nhưng trước khi tôi thiết lập một hình thức đầu vào thuật sĩ mà tôi gọi Quote.cshtml. Đằng sau Quote.cshtml, tôi đã thiết lập một mô hình có tên là QuoteModel.cs.

Quote.cshtml tại cơ bản nhất của nó (Tôi bỏ đi tất cả các logic wizard và chỉ hiển thị một đầu vào):

<td width="40%"> 
    @Html.LabelFor(m => m.FirstName, new { @class = "mylabelstyle", title = "Enter first name." }) 
</td> 
<td width="60%"> 
    @Html.TextBoxFor(m => m.FirstName) 
    @Html.ValidationMessageFor(m => m.FirstName) 
</td> 

QuoteModel.cs (một lần nữa, chỉ thấy một đầu vào; nb: sử dụng các DataAnnotationExtensions)

public class QuoteModel 
{ 
    [Required(ErrorMessage = "First Name required.")] 
    [Display(Name = "First Name:")] 
    public string FirstName { get; set; } 
} 

Bây giờ tôi đang cố gắng để tích hợp MvcMailer, trong đó thiết lập IQuoteMailer.cs, QuoteMailer.cs, _Layout.cshtml, và QuoteMail.cshtml. Các QuoteMail.cshtml là những gì người nhận của thư cuối cùng sẽ nhìn thấy. Tôi cũng thiết lập một QuoteController.cs, trong đó tôi đã đặt mã thích hợp theo yêu cầu của MvcMailer. Đó là trong các QuoteMailer.cs và QuoteController.cs nơi tôi gặp khó khăn khi truyền đầu vào của người dùng từ Quote.cshtml (được dựa trên mô hình trong QuoteModel.cs).

IQuoteMailer.cs:

public interface IQuoteMailer 
    {    
     MailMessage QuoteMail(); 
    } 

QuoteMailer.cs:

public class QuoteMailer : MailerBase, IQuoteMailer  
{ 
    public QuoteMailer(): 
     base() 
    { 
     MasterName="_Layout"; 
    } 


    public virtual MailMessage QuoteMail() 
    { 
     var mailMessage = new MailMessage{Subject = "QuoteMail"}; 

     mailMessage.To.Add("[email protected]"); 
     ViewBag.Data = someObject; 
        //I imagine this is where I can pass my model, 
        //but I am not sure (do I have to iterate each and 
        //every input (there are like 20 in QuoteModel.cs)? 

       return mailMessage; 
    } 

QuoteMail.cshtml (_Layout.cshtml là khá chuẩn, do đó không hiển thị ở đây):

@*HTML View for QuoteMailer#QuoteMail*@ 

Welcome to MvcMailer and enjoy your time!<br /> 
<div class="mailer_entry"> 
    <div class="mailer_entry_box"> 
     <div class="mailer_entry_text"> 
      <h2> 
       INSERT_TITLE 
      </h2> 
      <p> 
       INSERT_CONTENT 
       //I believe I am going to use a "@" command like @ViewData 
       //to pass FirstName, but again, not sure how to bind 
       //the model and then pass it. 
      </p> 
      <p> 
       INSERT_CONTENT 
      </p> 
     </div> 
    </div> 
</div> 

Và cuối cùng, các phần có liên quan của QuoteController.cs (lưu ý rằng tôi đang sử dụng một thuật sĩ, do đó, một phần của vấn đề của tôi là tìm hiểu nơi để đặt mã MvcMailer, nhưng tôi nghĩ rằng tôi có thể có nó bên phải):

public class QuoteController: Bộ điều khiển {

/// <summary> 
    /// MvcMailer 
    /// </summary> 
    private IQuoteMailer _quoteMailer = new QuoteMailer(); 
    public IQuoteMailer QuoteMailer 
    { 
     get { return _quoteMailer; } 
     set { _quoteMailer = value; } 
    } 

    // 
    // GET: /Quote/ 
    [HttpGet] 
    public ActionResult Quote() 
    { 
     HtmlHelper.ClientValidationEnabled = true; 
     HtmlHelper.UnobtrusiveJavaScriptEnabled = true; 
     //In order to get the clientside validation (unobtrusive), 
     //the above lines are necessary (where action takes place) 
     return View(); 
    } 

    // 
    // POST: /Matrimonial/ 
    [HttpPost] 
    public ActionResult Quote(QuoteModel FinishedQuote) 
    { 
     if (ModelState.IsValid) 
     { 
      QuoteMailer.QuoteMail().Send(); 
      return View("QuoteMailSuccess", FinishedQuote); 
     } 
     else return View(); 
    } 

    // 
    // POST: /Matrimonial/Confirm 
    [HttpPost] 
    public ActionResult QuoteMailConfirm(QuoteModel FinishedQuote) 
    { 
     return PartialView(FinishedQuote); 
    } 

}

Vì vậy, sự nhầm lẫn của tôi là như thế nào để vượt qua QuoteModel mà tôi đã tạo, để cuối cùng tôi có thể lấy dữ liệu người dùng nhập vào và sau đó tạo khung nhìn MvcMailer.

Tôi đánh giá cao sự trợ giúp của cộng đồng.

Trả lời

15

Bạn có thể có giao diện IQuoteMailer đi theo mô hình:

public interface IQuoteMailer 
{ 
    MailMessage QuoteMail(QuoteModel model); 
} 

và trong việc sử dụng thực hiện mô hình này:

public class QuoteMailer : MailerBase, IQuoteMailer 
{ 
    public QuoteMailer() : base() 
    { 
     MasterName = "_Layout"; 
    } 


    public virtual MailMessage QuoteMail(QuoteModel model) 
    { 
     var mailMessage = new MailMessage 
     { 
      Subject = "QuoteMail" 
     }; 
     mailMessage.To.Add("[email protected]"); 

     // Use a strongly typed model 
     ViewData = new ViewDataDictionary(model); 
     PopulateBody(mailMessage, "QuoteMail", null); 
     return mailMessage; 
    } 
} 

sau đó từ bộ điều khiển khi bạn quyết định gửi qua đường bưu điện thông qua các mô hình :

[HttpPost] 
public ActionResult Quote(QuoteModel FinishedQuote) 
{ 
    if (ModelState.IsValid) 
    { 
     QuoteMailer.QuoteMail(FinishedQuote).Send(); 
     return View("QuoteMailSuccess", FinishedQuote); 
    } 
    else return View(); 
} 

và cuối cùng là mẫu ()) bạn có thể sử dụng mô hình:

@using AppName.Models 
@model QuoteModel 

Welcome to MvcMailer and enjoy your time! 
<br /> 
<div class="mailer_entry"> 
    <div class="mailer_entry_box"> 
     <div class="mailer_entry_text"> 
      <h2> 
       INSERT_TITLE 
      </h2> 
      <p> 
       Hello @Model.FirstName 
      </p> 
      <p> 
       INSERT_CONTENT 
      </p> 
     </div> 
    </div> 
</div> 
+0

Hết. Cảm ơn bạn đã trả lời.Sẽ kiểm tra sau và báo cáo tiến độ. – REMESQ

+2

Điều này làm việc tuyệt vời. Cảm ơn! Đánh dấu thích hợp. – REMESQ

+0

Điều này làm việc tuyệt vời, nhưng tôi đã thực sự mong đợi các chức năng PopulateBody để có một tham số Model. Tôi đoán tôi có thể thêm một phương pháp mở rộng một cách dễ dàng đủ. –

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