vista validaciones una tutorial tabla paginacion mvc multiples mostrar modelos modelo form filtro datos controlador busqueda asp.net-mvc view model mvcmailer

asp.net-mvc - validaciones - paginacion mvc razor



MvcMailer: toma de la entrada del usuario en la vista a través del modelo y luego insertarlo en el correo (1)

Puede hacer que la interfaz IQuoteMailer tome el modelo:

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

y en la implementación usa 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 decide enviar el correo, pase 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>

No sé si estoy explicando esto correctamente, o si la solución es bastante simple, así que aquí va:

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 omitiendo toda la lógica del asistente y solo mostrando 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 (una vez más, solo se muestra la entrada; nb: utilizando DataAnnotationExtensions )

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

Ahora intento integrar MvcMailer, que configura 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 utilizando un asistente, por lo tanto, parte de mi problema es averiguar dónde colocar el código de MvcMailer, pero creo que puedo hacerlo bien):

clase pública QuoteController: Controller {

/// <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 sobre cómo aprobar el QuoteModel que creé, de modo que, en última instancia, puedo tomar los datos inputados del usuario y luego generar la vista de MvcMailer.

Aprecio la ayuda de las comunidades.