Ошибка: 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
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" })
Надеюсь, это поможет;)