MvcMailer: просмотр пользовательских данных через модель и вставка их в почту - PullRequest
8 голосов
/ 10 июля 2011

Я не знаю, правильно ли я объясняю это, или решение довольно простое, поэтому здесь идет речь:

Я использую 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, но я думаю, что он может быть правильным):

открытый класс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);
    }

}

Итак, я путаюсь с тем, как передать созданную мной QuoteModel, чтобы в конечном итоге я мог взять введенные пользователем данные и затем сгенерировать представление MvcMailer..

Я ценю помощь сообщества.

1 Ответ

15 голосов
/ 10 июля 2011

У вас может быть интерфейс 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>
...