2014-04-02 49 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

相關問題