Ошибка: ViewData с ключом "Адрес" имеет тип "System.String", но это должен быть тип "IEnumerable <SelectListItem>"

Я отправляю почту из этой формы. И когда я нажимаю кнопку "Отправить", я вижу ошибку "ViewData с ключом" Адрес "имеет тип"System.String", но это должен быть тип"IEnumerable ""

Самое смешное, что письмо было отправлено, но заявка выпала... Помогите, пожалуйста, ребята!

Вот моя модель:

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

namespace MvcLibraly.Models
{
    public class MailModel
    {
        public string To { get; set; }
        public string Adress { get; set; }
        public string Subject { get; set; }
        public string Body { get; set; }

    }
}

Вот контроллер:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc;
using System.Data;
using System.Data.Entity;
using MvcLibraly.Models;
using System.Web.Mvc.Html;
using System.Web.UI.WebControls;


namespace MvcLibraly.Controllers
{
    public class SendMailerController : Controller
    {
        private BookDBContext db = new BookDBContext();
        //
        // GET: /SendMailer/

        public ActionResult Index(string nameEmail)
        {



            var EmailLst = new List<string>();

            var EmailQry = from f in db.Uchets
                           orderby f.Adress where f.DateVoz < DateTime.Now
                           select f.Adress;
            EmailLst.AddRange(EmailQry.Distinct());
            ViewBag.nameEmail = new SelectList(EmailLst);



            return View();
        }

        /// <summary>
        /// Send Mail with Gmail
        /// </summary>
        /// <param name="objModelMail">MailModel Object, keeps all properties</param>
        /// <param name="fileUploader">Selected file data, example-filename,content,content type(file type- .txt,.png etc.),length etc.</param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Index(MvcLibraly.Models.MailModel objModelMail, HttpPostedFileBase fileUploader)
        {





            if (ModelState.IsValid)
            {


                string from = "myadress@gmail.com"; //example:- sourabh9303@gmail.com
                using (MailMessage mail = new MailMessage(from, objModelMail.Adress))
                {
                    mail.Subject = objModelMail.Subject;
                    mail.Body = objModelMail.Body;
                    if (fileUploader != null)
                    {
                        string fileName = Path.GetFileName(fileUploader.FileName);
                        mail.Attachments.Add(new Attachment(fileUploader.InputStream, fileName));
                    }
                    mail.IsBodyHtml = false;
                    SmtpClient smtp = new SmtpClient();
                    smtp.Host = "smtp.gmail.com";
                    smtp.EnableSsl = true;
                    NetworkCredential networkCredential = new NetworkCredential(from, "mypassword");
                    smtp.UseDefaultCredentials = true;
                    smtp.Credentials = networkCredential;
                    smtp.Port = 587;
                    smtp.Send(mail);
                    ViewBag.Message = "Sent";
                    return View("Index", objModelMail);
                }
            }
            else
            {
                return View();
            }
        }
    }
}

Вот вид:

@model MvcLibraly.Models.MailModel

@{
    ViewBag.Title = "Send Mail";
}
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script>
    $(document).ready(function () {
        if ('@ViewBag.Message' == 'Sent') {
            alert('Good!');
        }
    });
</script>
<h2>Send mail</h2>
<fieldset>
    <legend>Send Email
    </legend> 
   @using (@Html.BeginForm("Index", "SendMailer", FormMethod.Post, new { @id = "form1", @enctype = "multipart/form-data" }))
    {
     @Html.ValidationSummary()
        <table>
            <tr>

                <td>To:
                </td>
                <td>
                    @*@Html.TextBoxFor(m => m.To)*@
                    @Html.DropDownListFor(model => model.Adress, (SelectList)ViewBag.nameEmail, new { style = "width: 310px" }) 
                    @Html.ValidationMessageFor(model => model.Adress, "Error!")
                </td>
            </tr>
            <tr>
                <td>Subject:
                </td>
                <td>
                    @Html.TextBoxFor(model => model.Subject)
                     @Html.ValidationMessageFor(model => model.Subject, "Error!")
                </td>
            </tr>
            @*<tr>
                <td>Attachment
                </td>
                <td>
                    <input type="file" name="fileUploader" />
                </td>
            </tr>*@
            <tr>
                <td>Body:
                </td>
                <td>
                    @Html.TextAreaFor(model => model.Body)
                     @Html.ValidationMessageFor(model => model.Body, "Error!")
                </td>
            </tr> 
        </table>    


        <input type="submit" value="Send" />
    }
</fieldset>

Ошибка в этой строке:

@Html.DropDownListFor(model => model.Adress, (SelectList)ViewBag.nameEmail, new { style = "width: 310px" }) 

ОБНОВИТЬ!!!

контроллер:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc;
using System.Data;
using System.Data.Entity;
using MvcLibraly.Models;
using System.Web.Mvc.Html;
using System.Web.UI.WebControls;


namespace MvcLibraly.Controllers
{
    public class SendMailerController : Controller
    {
        private BookDBContext db = new BookDBContext();
        //
        // GET: /SendMailer/

        private List<SelectListItem> GetEmailList()
{
    var emailLst = (from f in db.Uchets
                    orderby f.Adress
                    where f.DateVoz < DateTime.Now
                    select new SelectListItem
                    {
                        Text = f.Adress,
                        Value = f.Adress
                    }).Distinct().ToList();

    return emailLst;
}

public ActionResult Index(string nameEmail)
{
    ViewBag.nameEmail = GetEmailList();
    return View();
}

[HttpPost]
public ActionResult Index(MvcLibraly.Models.MailModel objModelMail, HttpPostedFileBase fileUploader)
{
    if (ModelState.IsValid)
    {
        // ...
    }
    else
    {
        ViewBag.nameEmail = GetEmailList();
        return View();
    }
}

Посмотреть:

@model MvcLibraly.Models.MailModel

@{
    ViewBag.Title = "Send Mail";
}
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script>
    $(document).ready(function () {
        if ('@ViewBag.Message' == 'Sent') {
            alert('Good!');
        }
    });
</script>
<h2>Send mail</h2>
<fieldset>
    <legend>Send Email
    </legend> 
   @using (@Html.BeginForm("Index", "SendMailer", FormMethod.Post, new { @id = "form1", @enctype = "multipart/form-data" }))
    {
     @Html.ValidationSummary()
        <table>
            <tr>

                <td>To:
                </td>
                <td>
                    @*@Html.TextBoxFor(m => m.To)*@
                    @Html.DropDownListFor(model => model.Adress, (IList<SelectListItem>) ViewBag.nameEmail, new { style = "width: 310px" })
                    @Html.ValidationMessageFor(model => model.Adress, "Error!")
                </td>
            </tr>
            <tr>
                <td>Subject:
                </td>
                <td>
                    @Html.TextBoxFor(model => model.Subject)
                     @Html.ValidationMessageFor(model => model.Subject, "Error!")
                </td>
            </tr>
            @*<tr>
                <td>Attachment
                </td>
                <td>
                    <input type="file" name="fileUploader" />
                </td>
            </tr>*@
            <tr>
                <td>Body:
                </td>
                <td>
                    @Html.TextAreaFor(model => model.Body)
                     @Html.ValidationMessageFor(model => model.Body, "Error!")
                </td>
            </tr> 
        </table>    


        <input type="submit" value="Send" />
    }
</fieldset>

1 ответ

Решение

ViewBag.nameEmail должен быть IEnumerable , поэтому это должно быть исправлено в вашем действии HttpGet. Кроме того, в вашем действии HttpPost, если модель недействительна (часть 'else'), вы также должны снова вернуть список адресов электронной почты. в противном случае ViewBag.nameEmail является нулевым или пустым. Это исправление в вашем контроллере:

private List<SelectListItem> GetEmailList()
{
    var emailLst = (from f in db.Uchets
                    orderby f.Adress
                    where f.DateVoz < DateTime.Now
                    select new SelectListItem
                    {
                        Text = f.Adress,
                        Value = f.Adress
                    }).Distinct().ToList();

    return emailLst;
}

public ActionResult Index(string nameEmail)
{
    ViewBag.nameEmail = GetEmailList();
    return View();
}

[HttpPost]
public ActionResult Index(MvcLibraly.Models.MailModel objModelMail, HttpPostedFileBase fileUploader)
{
    if (ModelState.IsValid)
    {
        // ...
    }
    else
    {
        ViewBag.nameEmail = GetEmailList();
        return View();
    }
}

... и это исправление в вашем представлении:

@Html.DropDownListFor(model => model.Adress, (IList<SelectListItem>) ViewBag.nameEmail, new { style = "width: 310px" })

Надеюсь, это поможет;)

Другие вопросы по тегам