2011-07-10 13 views
8

Nie wiem, czy jestem tłumacząc to poprawnie, czy rozwiązanie jest dość proste, więc tu idzie:MvcMailer: Mając dane wprowadzone przez użytkownika w widoku modelu, a następnie poprzez włożenie go do poczty

używam MvcMailer , ale wcześniej ustawiłem formularz wejściowy do kreatora, który nazywam Quote.cshtml. Za Quote.cshtml ustawiłem model o nazwie QuoteModel.cs.

Quote.cshtml w jego najbardziej podstawowym (wyjeżdżam na cały logiki kreatora i pokazując tylko jedno wejście):

<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 (ponownie, tylko pokazując jedno wejście; NB: using DataAnnotationExtensions)

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

teraz staram się zintegrować MvcMailer, który określa się IQuoteMailer.cs, QuoteMailer.cs, _Layout.cshtml i QuoteMail.cshtml. QuoteMail.cshtml jest tym, co ostatecznie zobaczy odbiorca wiadomości. Stworzyłem również QuoteController.cs, w którym umieściłem odpowiedni kod wymagany przez MvcMailer. To jest w QuoteMailer.cs i QuoteController.cs, gdzie mam problem z przekazaniem danych użytkownika z Quote.cshtml (który jest oparty na modelu w 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 jest dość standardowy, więc nie pokazano tutaj):

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

I na koniec odpowiednie części QuoteController.cs (pamiętaj, że używam kreatora, dlatego część mojego problemu jest dowiedzieć się, gdzie umieścić kod MvcMailer, ale myślę, że mogę mieć rację):

public class QuoteController: Kontroler {

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

}

Więc moje zamieszanie jest jak przekazać utworzony przeze mnie QuoteModel, aby ostatecznie móc pobierać dane wprowadzone przez użytkownika, a następnie wygenerować widok MvcMailer.

Doceniam pomoc społeczności.

Odpowiedz

15

Można mieć interfejs IQuoteMailer przyjąć model:

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

iw wykorzystaniu implementacji tego modelu:

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

następnie ze sterownika, gdy zdecydujesz się wysłać pocztę przekazać model :

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

i wreszcie w szablonie (~/Views/QuoteMailer/QuoteMail.cshtml) można użyć modelu:

@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

Poza domem. Dzięki za odpowiedź.Sprawdzę później i zgłoś postęp. – REMESQ

+2

To zadziałało świetnie. Dzięki! Oznakowanie odpowiednio. – REMESQ

+0

To działało świetnie, ale naprawdę oczekiwałem, że funkcja PopulateBody ma parametr Model. Chyba mogę dość łatwo dodać metodę rozszerzenia. –

Powiązane problemy