Have a error: ViewData with key "Adress" is of type "System.String", but it must be a type "IEnumerable <SelectListItem>"

StackOverflow https://stackoverflow.com/questions/22803670

Question

I send mail from this form. And when I push "Send" button, I see error "ViewData with key "Adress" is of type "System.String", but it must be a type "IEnumerable ""

The funny thing is that the letter was sent, but the application is fall... Help me please, guys!

Here is my Model:

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; }

    }
}

Here is Controller:

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();
            }
        }
    }
}

Here is 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>

Error in this line:

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

UPDATE!!!

Controller:

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();
    }
}

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>
Was it helpful?

Solution

ViewBag.nameEmail must be an IEnumerable < SelectListItem >, so this should be fixed in your HttpGet action. Also, at your HttpPost action, if the model is not valid (the 'else' part), you should also return the email list again. otherwise the ViewBag.nameEmail is null or empty. This is the fix in your controller:

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();
    }
}

... and this is the fix in your View:

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

Hope that helps ;)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top