Приложение с Почтовым MVC не работает - PullRequest
1 голос
/ 17 сентября 2011

У меня есть MVC3 project. На своей странице контактов я хотел бы добавить возможность добавления вложения в электронное письмо, отправленное клиентом.

Я использую Postal. Это работает хорошо, но я не могу заставить работать приложение.

Вот часть моего кода, связанная с этим:

У меня есть model class:

public class ContactEmail
{
    [ScaffoldColumn(false)]
    public int id { get; set; }

    [Required(ErrorMessage = "Name is required!")]
    [DataType(DataType.Text)]
    [DisplayName("Name")]
    public string name { get; set; }

    [Required(ErrorMessage = "Email Address is required!")]
    [DataType(DataType.EmailAddress)]
    [DisplayName("Email Address")]
    [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "Email Address is not valid.")]
    public string email { get; set; }

    [Required(ErrorMessage = "Country is required!")]
    [DisplayName("Country")]
    public string country { get; set; }

    [DisplayName("Subject")]
    public string subject { get; set; }

    [Required(ErrorMessage = "Message is required!")]
    [DisplayName("Message")]
    [StringLength(1500)]
    public string message { get; set; }

    [ScaffoldColumn(false)]
    public DateTime datetime { get; set; }

    public HttpPostedFileBase attachment { get; set; }

Вот мой Postal Controller:

public class PostalController : Controller
{
    [HttpPost]
    public ActionResult Send(ContactEmail model)
    {

        if (ModelState.IsValid)
        {
            Random random = new Random();
            var ticket = random.Next(1000000000, 2000000000);

            dynamic courriel = new Email("Postal");
            courriel.To = "support@coderfortraders.com";
            courriel.Name = model.name;
            courriel.Country = model.country;
            courriel.Subject = model.subject;
            courriel.From = model.email;
            courriel.Message = model.message;
            courriel.TicketId = ticket;
            courriel.Attachment = model.attachment;
            //if (model.Attachment != null && model.Attachment.ContentLength > 0)
            //{
            //    var attachment = new Attachment(model.Attachment.InputStream, model.Attachment.FileName);
            //    courriel.Attachments.Add(attachment);
            //}
            //courriel.Attachment = model.Attachment; 

            courriel.Attach(new Attachment(model.attachment.InputStream, model.attachment.FileName));

            Task task = courriel.SendAsync();

            //courriel.Send();

            return RedirectToAction("Sent", "Contact");
        }

        ViewData["MessageSent"] = false;

        return View("~/Views/Contact/Contact.cshtml");
    }

и, наконец, вот форма, которую я использую в своем Contact.cshtml view:

@using (Html.BeginForm("Send", "Postal"))
{        
    @Html.ValidationSummary(false)

    <p>
       @Html.LabelFor(model => model.name)
       @Html.TextBoxFor(model => model.name, new { @size = 35 })
       @Html.ValidationMessageFor(model => model.name, "*")
    </p>                      
    <p>
       @Html.LabelFor(model => model.email)
       @Html.TextBoxFor(model => model.email, new { @size = 35 })
       @Html.ValidationMessageFor(model => model.email, "*")
    </p>
    <p>
       @Html.LabelFor(model => model.subject)
       @Html.DropDownList(
           "subject", 
           new[] { 
               new SelectListItem { 
                   Text = "NT Indicator Quote", 
                   Value = "NT Indicator Quote" 
               }, 
               new SelectListItem { 
                   Text = "NT Strategy Quote", 
                   Value = "NT Strategy Quote" 
               }, 
               new SelectListItem { 
                   Text = "Comments", 
                   Value = "Comments" 
               }, 
               new SelectListItem { 
                   Text = "other", 
                   Value = "other" 
               }
           }
       ); // @Html.DropDownList(
       @Html.ValidationMessageFor(model => model.subject, "*")
    </p>
    <p>
       @Html.LabelFor(model => model.message)
       @Html.TextAreaFor(model => model.message, new { @cols = 50, @rows = 10 })
       @Html.ValidationMessageFor(model => model.message, "*")
    </p>
    <p>
       @Html.LabelFor(model => model.attachment)
       @Html.TextBoxFor(model => model.attachment, new { type = "file" })
       @Html.ValidationMessageFor(model => model.attachment)
    </p>          
    <p><input type="submit" id="submit" name="submit" value="Submit" /></p>            
} <!-- End form -->

Я получаю следующее сообщение об ошибке:

Ссылка на объект не установлена ​​для экземпляра объекта. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и месте ее возникновения в коде.
Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.
Ошибка источника: Строка 44: courriel.Attach (новое вложение (model.attachment.InputStream, model.attachment.FileName));

Не могли бы вы помочь мне выяснить проблему здесь? Спасибо!

Вот HTML-код из источника представления:

<form action="/Postal/Send?enctype=multipart%2Fform-data" method="post">
    <div class="validation-summary-valid" data-valmsg-summary="true">
        <ul>
            <li style="display:none"></li>
        </ul>
    </div>
    <p>
        <label for="name">Name</label>
        <input data-val="true" data-val-required="Name is required!" id="name" name="name" size="35" type="text" value="" />
        <span class="field-validation-valid" data-valmsg-for="name" data-valmsg-replace="false">*</span>
    </p>
    <p>
        <label for="email">Email Address</label>
        <input data-val="true" data-val-regex="Email Address is not valid." data-val-regex-pattern="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}" data-val-required="Email Address is required!" id="email" name="email" size="35" type="text" value="" />
        <span class="field-validation-valid" data-valmsg-for="email" data-valmsg-replace="false">*</span>
    </p>
    <p>
        <label for="subject">Subject</label>
        <select id="subject" name="subject">
            <option value="NT Indicator Quote">NT Indicator Quote</option>
            <option value="NT Strategy Quote">NT Strategy Quote</option>
            <option value="Comments">Comments</option>
            <option value="other">other</option>
        </select>
        <span class="field-validation-valid" data-valmsg-for="subject" data-valmsg-replace="false">*</span>
    </p>
    <p>
        <label for="message">Message</label>
        <textarea cols="50" data-val="true" data-val-length="The field Message must be a string with a maximum length of 1500." data-val-length-max="1500" data-val-required="Message is required!" id="message" name="message" rows="10">
        </textarea>
        <span class="field-validation-valid" data-valmsg-for="message" data-valmsg-replace="false">*</span>
    </p>
    <p>
        <label for="attachment">attachment</label>
        <input id="attachment" name="attachment" type="file" value="" />
        <span class="field-validation-valid" data-valmsg-for="attachment" data-valmsg-replace="true"></span>
    </p>
    <p>
        <input type="submit" id="submit" name="submit" value="Submit" />
    </p>
</form> <!-- End form -->

    </div>

1 Ответ

3 голосов
/ 17 сентября 2011

Вам нужно добавить атрибут enctype="multipart/form-data" в форму, если вы хотите загрузить файлы:

@using (Html.BeginForm("Send", "Postal", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{
    ...
}

Также закажите этот пост в блоге от Haacked.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...