Asp.net-Mvc

MvcMailer:通過模型在視圖中獲取使用者輸入,然後將其插入到郵件中

  • August 25, 2016

我不知道我是否正確解釋了這一點,或者解決方案是否相當簡單,所以這裡是:

我正在使用 MvcMailer,但在此之前我設置了一個嚮導輸入表單,我稱之為 Quote.cshtml。在 Quote.cshtml 後面,我建立了一個名為 QuoteModel.cs 的模型。

Quote.cshtml 最基本的(我省略了所有的嚮導邏輯,只顯示一個輸入):

<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(同樣,只顯示一個輸入;nb:使用DataAnnotationExtensions

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

現在我正在嘗試集成 MvcMailer,它設置了 IQuoteMailer.cs、QuoteMailer.cs、_Layout.cshtml 和 QuoteMail.cshtml。QuoteMail.cshtml 是郵件收件人最終會看到的內容。我還設置了一個 QuoteController.cs,在其中放置了 MvcMailer 所需的適當程式碼。它在 QuoteMailer.cs 和 QuoteController.cs 中,我無法從 Quote.cshtml (基於 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("some-email@example.com");
       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 非常標準,所以這裡不顯示):

@*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>

最後是 QuoteController.cs 的相關部分(請注意,我正在使用嚮導,因此,我的部分問題是弄清楚將 MvcMailer 程式碼放在哪裡,但我想我可能是對的):

公共類報價控制器:控制器{

   /// <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);
   }

}

所以,我的困惑是如何傳遞我創建的 QuoteModel,以便最終我可以獲取使用者輸入的數據,然後生成 MvcMailer 視圖。

我感謝社區的幫助。

您可以讓IQuoteMailer界面採用模型:

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

並在實現中使用此模型:

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("some-email@example.com");

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

然後在您決定發送郵件時從控制器傳遞模型:

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

最後在模板 ( ~/Views/QuoteMailer/QuoteMail.cshtml) 中,您可以使用模型:

@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>

引用自:https://stackoverflow.com/questions/6641502