2011-07-10 12 views
8

No sé si me estoy explicando esto correctamente, o si la solución es bastante simple, así que aquí va:MvcMailer: Tomar la entrada del usuario a la vista a través del modelo y luego insertarlo en el correo

estoy usando MvcMailer , pero antes configuré un formulario de entrada de asistente al que llamo Quote.cshtml. Detrás de Quote.cshtml, configuré un modelo llamado QuoteModel.cs.

Quote.cshtml en su forma más básica (estoy dejando salir toda la lógica asistente y mostrando sólo una entrada):

<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 (de nuevo, sólo mostrando la entrada; NB: el uso la DataAnnotationExtensions)

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

Ahora estoy tratando de integrar MvcMailer, que establece IQuoteMailer.cs, QuoteMailer.cs, _Layout.cshtml y QuoteMail.cshtml. QuoteMail.cshtml es lo que verá el destinatario del correo. También configuré un QuoteController.cs, en el cual coloqué el código apropiado requerido por MvcMailer. Está en QuoteMailer.cs y QuoteController.cs donde tengo problemas para pasar la entrada del usuario de Quote.cshtml (que se basa en el modelo de 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 es bastante estándar, por lo que no se muestra aquí):

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

Y, por último, las partes relevantes de QuoteController.cs (tenga en cuenta que estoy usando un asistente, por lo tanto, parte de mi problema es averiguar dónde colocar el código MvcMailer, pero creo que la tengan derecho):

QuoteController clase pública: Controlador {

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

}

Por lo tanto, mi confusión es cómo para aprobar el QuoteModel que creé, de modo que, en última instancia, pueda tomar los datos inputados del usuario y luego generar la vista de MvcMailer.

Aprecio la ayuda de las comunidades.

Respuesta

15

usted podría tener la interfaz de IQuoteMailer tomar el modelo:

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

y en el uso de la aplicación de este modelo:

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

luego desde el controlador cuando se decida a enviar el correo pasar el modelo :

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

y finalmente en la plantilla (~/Views/QuoteMailer/QuoteMail.cshtml) puede usar el modelo:

@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

Out and about. Gracias por responder.Verificará más tarde e informará el progreso. – REMESQ

+2

Esto funcionó muy bien. ¡Gracias! Marcado apropiadamente. – REMESQ

+0

Esto funcionó muy bien, pero realmente esperaba que la función PopulateBody tuviera un parámetro de modelo. Creo que puedo agregar un método de extensión con la suficiente facilidad. –

Cuestiones relacionadas