Форма электронной почты с MvcMailer

#c# #asp.net-mvc-3 #email #mvcmailer

#c# #asp.net-mvc-3 #Адрес электронной почты #mvcmailer

Вопрос:

Я разрабатываю приложение MVC 3 и отправляю электронные письма с помощью MvcMailer.Я могу отправлять основные электронные письма, но я пытаюсь отправить содержимое формы по электронной почте и, похоже, не могу с этим справиться.

Вот код для моей модели:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace DFPProductions_Default.Models
{
public class Application
{
    [Required]
    [Display(Name = "First Name")]
    public string ApplicantFirstName { get; set; }
    [Required]
    [Display(Name = "Last Name")]
    public string ApplicantLastName { get; set; }
    [Display(Name = "Birth Date")]
    public DateTime ApplicantBirthDate { get; set; }
    [Required]
    [Display(Name = "Cellphone Number")]
    public string ApplicantCellphoneNumber { get; set; }
    [Display(Name = "Postal Address")]
    public string PostalNumber { get; set; }
    [Display(Name = "Suburb")]
    public string ApplicantSuburb { get; set; }
    [Display(Name = "City")]
    public string ApplicantCity { get; set; }
    [Display(Name = "Post Code")]
    public string ApplicationPostalCode { get; set; }
    [Required]
    [Display(Name = "Email Address")]
    public string ApplicantEmailAddress { get; set; }

    [Display(Name = "First Name")]
    public string ParentFirstName { get; set; }
    [Display(Name = "Last Name")]
    public string ParentLastName { get; set; }
    [Display(Name = "Email Address")]
    public string ParentEmailAddress { get; set; }
    [Display(Name = "Postal Address")]
    public string ParentPostalNumber { get; set; }
    [Display(Name = "Suburb")]
    public string ParentSuburb { get; set; }
    [Display(Name = "City")]
    public string ParentCity {get; set;}
    [Display(Name = "Post Code")]
    public string ParentPostalCode {get; set;}


}
  

}

На мой взгляд, у меня есть поля редактора, вот несколько:

     <div class="editor-label">
        @Html.LabelFor(model => model.ApplicantFirstName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ApplicantFirstName)
        @Html.ValidationMessageFor(model => model.ApplicantFirstName)
    </div>


    <div class="editor-label">
        @Html.LabelFor(model => model.ApplicantLastName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ApplicantLastName)
        @Html.ValidationMessageFor(model => model.ApplicantLastName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.ApplicantBirthDate)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ApplicantBirthDate)
        @Html.ValidationMessageFor(model => model.ApplicantBirthDate)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.ApplicantCellphoneNumber)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ApplicantCellphoneNumber)
        @Html.ValidationMessageFor(model => model.ApplicantCellphoneNumber)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.ApplicantEmailAddress)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ApplicantEmailAddress)
        @Html.ValidationMessageFor(model => model.ApplicantEmailAddress)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.PostalNumber)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.PostalNumber)
        @Html.ValidationMessageFor(model => model.ApplicantEmailAddress)
    </div>

     <div class="editor-label">
        @Html.LabelFor(model => model.ApplicantSuburb)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ApplicantSuburb)
        @Html.ValidationMessageFor(model => model.ApplicantSuburb)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.ApplicantCity)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ApplicantCity)
        @Html.ValidationMessageFor(model => model.ApplicantCity)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.ApplicationPostalCode)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ApplicationPostalCode)
        @Html.ValidationMessageFor(model => model.ApplicationPostalCode)
    </div>

</div> 
  

Я вызвал приложение электронной почты. Код для ApplicationMailer является:

     public virtual MailMessage Application()
    {
        var mailMessage = new MailMessage{Subject = "Application"};

        mailMessage.To.Add("debbie@gmail.com");
        ViewBag.Data = "Debbie";
        PopulateBody(mailMessage, viewName: "Application");

        return mailMessage;
    }
  

У меня есть это в моем контроллере:

     private IApplicationMailer _applicationMailer = new ApplicationMailer();
    public IApplicationMailer ApplicationMailer
    {
        get { return _applicationMailer; }
        set { _applicationMailer = value; }
    }

    public ActionResult SendApplication()
    {
        ApplicationMailer.Application().Send();
         //Send() extension method: using Mvc.Mailer
        return RedirectToAction("Index");
    }
  

И все, что я добавил в представление электронной почты, это

 @model DFPProductions_Default.Models.Application
  

Электронное письмо отправляется, поэтому оно настроено правильно, но я действительно не уверен, как получить значения, вставленные в форму в представлении электронной почты.

Спасибо, Эми

Комментарии:

1. См. Раздел «Редактирование вашего представления» в руководстве . По сути, вы просто печатаете значения из модели («значения, вставленные в форму») в представлении электронной почты.

2. Привет, спасибо. Я видел этот раздел в руководстве, и я смог использовать адрес электронной почты, хранящийся в базе данных. Но означает ли это, что мне придется сначала сохранить приложение в базе данных, прежде чем отправлять электронное письмо?

3. Возможно; не прочитал вашу стену кода. Когда вы это делаете ViewBag.Data = "Debbie"; , вы делаете Data свойство доступным для представления, чтобы представление могло его распечатать, в результате чего получается «Debbie». Похоже, вы можете сделать то же самое для других «значений, вставленных в форму».

4. Хорошо, я понимаю, о чем ты говоришь. Было бы легко, если бы я вызывал запись базы данных, потому что я бы просто сказал, что var заявитель = db.Заявитель. FirstOrDefault(); а затем заявитель. ApplicantFullName или что-то в этом роде. Но если я хочу отправить электронное письмо, когда пользователь нажимает «Отправить», и на самом деле ничего не сохраняется в БД, как мне получить значения?

5. Нет необходимости в базе данных. Вам нужно убедиться, что метод action SendApplication действительно получает отправленную модель (например SendApplication(Application application) ), а затем передает модель почтовому средству; например, в качестве аргумента Application() метода. Затем внутри этого метода вы можете заполнить ViewBag из аргумента. Таким образом, приложение переходит в метод действия, передается почтовой программе, которая заполняет представление, а затем отправляет отображенное представление в виде электронного письма.

Ответ №1:

Вам нужно использовать данные вашего класса модели в контроллере примерно так:

 public virtual MailMessage Application(ModelNameHere model)
    {
        var mailMessage = new MailMessage{Subject = "Application"};

        mailMessage.To.Add("debbie@gmail.com");

        //add field from your view here
        string body = model.CellPhoneNumber   Model.FirstName;

        ViewBag.Data = "Debbie";
        PopulateBody(mailMessage, viewName: "Application", body);

        return mailMessage;
    }