MvcMailer:通過模型在視圖中獲取使用者輸入,然後將其插入到郵件中
我不知道我是否正確解釋了這一點,或者解決方案是否相當簡單,所以這裡是:
我正在使用 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>