2014-04-02 47 views
1

我从此表单发送邮件。当我按“发送”按钮,我看到错误“ViewData与键”Adress“是类型”System.String“,但它必须是一个类型”IEnumerable“”有错误:带有键“Adress”的ViewData的类型为“System.String”,但它必须是“IEnumerable <SelectListItem>”的类型

有趣的是,这封信是发送,但应用程序正在下降... 请帮助我,伙计们!

这里是我的模型:

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 = "[email protected]"; //example:- [email protected] 
       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(); 
      } 
     } 
    } 
} 

这里查看:

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

@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> 

在此行中的错误

更新!

控制器:

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> 

回答

0

ViewBag.nameEmail必须是IEnumerable的< SelectListItem>,所以这应该被固定在你的HTTPGET行动。另外,在您的HttpPost操作中,如果模型无效(“其他”部分),则应该再次返回电子邮件列表。否则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" }) 

希望帮助;)

+0

在同一行同样的错误。 .. – user3440844

+0

请显示您正在使用的确切代码。 –

+0

更新后的帖子吧! – user3440844

相关问题