【问题标题】:MVC 4: Every time I try to apply validation I get: "There is no ViewData item of type 'IEnumerable<SelectListItem>'" [duplicate]MVC 4:每次我尝试应用验证时,我都会得到:“没有 'IEnumerable<SelectListItem>' 类型的 ViewData 项”[重复]
【发布时间】:2016-04-10 16:23:21
【问题描述】:

我查看了许多其他堆栈溢出问题,有人报告了这个问题,但没有一个人能提供帮助。但是只有当我尝试对模型属性应用某种验证并且尝试强制执行该验证时(例如,将返回日期放在出发日期之前),我才会收到错误消息。如果我选择正确的值,它会起作用。

public int Id { get; set; }
    [Required(ErrorMessage = "-Select-")]
    public string Departure { get; set; }

    [Required(ErrorMessage = "-Select-")]
    public string Arrivals { get; set; }

    [Required(ErrorMessage = "Date Expected!")]
    [DataType(DataType.Date)]
    public System.DateTime DepartureDate { get; set; }

    [Required(ErrorMessage = "Date Expected!")]
    [DataType(DataType.Date)]
    [GreaterThan("DepartureDate", ErrorMessage="Retrun date must be after departure date!")]
    public System.DateTime ReturnDate { get; set; }

观点:

<p>From: </p>
@Html.DropDownList("Departures", ViewData["departures"] as List<SelectListItem>);
@Html.ValidationMessageFor(model => model.Departure, "Please choose a location");
<p>To: </p>
@Html.DropDownList("Arrivals", ViewData["arrivals"] as List<SelectListItem>);
@Html.ValidationMessageFor(model => model.Arrivals, "Please choose a location");

(选择列表在我的控制器中初始化)

 Departures.Add(new SelectListItem { Text = "Bristol", Value = "Bristol" });
 ViewData["departures"] = Departures;

还有更多.Add's,而且到达时也会重复

        [HttpGet]
    public ActionResult BookFlight()
    {
        // Check if the user is logged in, if not redirect to log in page
        if (User.Identity.IsAuthenticated)
        {
            Departures.Add(new SelectListItem { Text="-Select-", Value="0" });
            Departures.Add(new SelectListItem { Text = "London", Value = "London" });
            Departures.Add(new SelectListItem { Text = "Manchester", Value = "Manchester" });
            Departures.Add(new SelectListItem { Text = "Edinburgh", Value = "Edinburgh" });
            Departures.Add(new SelectListItem { Text = "East Midlands", Value = "East Midlands" });
            Departures.Add(new SelectListItem { Text = "Bristol", Value = "Bristol" });
            ViewData["departures"] = Departures;

            Arrivals.Add(new SelectListItem { Text = "-Select-  ", Value = "0" });
            Arrivals.Add(new SelectListItem { Text = "Paris", Value = "Paris" });
            Arrivals.Add(new SelectListItem { Text = "Barcelona", Value = "Barcelona" });
            Arrivals.Add(new SelectListItem { Text = "Madrid", Value = "Madrid" });
            Arrivals.Add(new SelectListItem { Text = "Amsterdam", Value = "Amsterdam" });
            Arrivals.Add(new SelectListItem { Text = "Prague", Value = "Prague" });
            Arrivals.Add(new SelectListItem { Text = "Nice", Value = "Nice" });
            Arrivals.Add(new SelectListItem { Text = "Milan", Value = "Milan" });
            Arrivals.Add(new SelectListItem { Text = "Geneva", Value = "Geneva" });
            Arrivals.Add(new SelectListItem { Text = "Rome", Value = "Rome" });
            ViewData["arrivals"] = Arrivals;

            return View();

        }
        else
            return RedirectToAction("../User/LogIn");
    }

    [HttpPost]
    public ActionResult BookFlight(FlightDetailsMD flights, FormCollection form)
    {
        Random rand = new Random();
        Random rand2 = new Random();
        if (ModelState.IsValid) 
        {
            var departureVal = form["departures"];
            var arrivalVal = form["arrivals"];
            using (var db = new FlightDetailsEntities()) 
            {
                var user = db.FlightDetails.Create();

                user.Id = rand.Next(100000, 199999) + rand2.Next(100000, 199999);
                user.Departure = departureVal;
                user.Arrivals = arrivalVal;
                user.DepartureDate = flights.DepartureDate;
                user.ReturnDate = flights.ReturnDate;

                db.FlightDetails.Add(user);
                db.SaveChanges();

                MailMessage mail = new MailMessage();
                mail.To.Add(User.Identity.Name);
                mail.From = new MailAddress(User.Identity.Name);
                mail.Subject = "Booking Confirmation";
                string Body = "Email from: <i>insert company name</i><br><br> Your booking is confirmed! You are going to " + user.Arrivals +
                    " on " + string.Format("{0:dd/MM/yyyy}", user.DepartureDate) + " and returning to " + user.Departure + " on " + string.Format("{0:dd/MM/yyyy}", user.ReturnDate) +
                    ".<br> Thank you for booking with us and we hope you have a nice time!" + "<br><h2>Reference #" + user.Id + "</h2>";
                mail.Body = Body;
                mail.IsBodyHtml = true;
                //SmtpClient client = new SmtpClient();
                using (SmtpClient client = new SmtpClient())
                {
                    client.EnableSsl = true;
                    client.UseDefaultCredentials = false;
                    client.Credentials = new NetworkCredential(User.Identity.Name, "RecurveBow");
                    client.Host = "smtp.live.com";
                    client.Port = 587;
                    client.DeliveryMethod = SmtpDeliveryMethod.Network;
                    client.Send(mail);
                }
                  /*
                    ViewData["departures"] = Departures;
                    ViewData["arrivals"] = Arrivals;
                */

                /*
                    ViewData["departures"] = " ";
                    ViewData["arrivals"] = " ";
                */

                return RedirectToAction("BookingDetails", "Home");
            }
        }

        return View();
    }

【问题讨论】:

  • 您能否向我们展示 GET 和 POST 操作,特别是您设置 ViewData["departures"] 和 ViewData["arrivals"] 的位置?
  • 更新了我的问题你要求的代码:)
  • 您应该在返回 View() 之前重置 ViewData["departures"] 和 ViewData["arrivals"] 的值;在 POST 动作中。它们不会发回您的 POST 操作,因此,当验证失败并且您查看引擎尝试呈现您的 .cshtml 页面时,它找不到 ViewData["departures"] 和 ViewData["arrivals"]。如果可行,请告诉我:)
  • 你的意思是我刚刚放入的 cmets 中的任何一段代码吗?
  • 赛义夫的回答就是我的意思。

标签: c# .net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

做了一些改动。看看这个 :)。

[HttpGet]
    public ActionResult BookFlight()
    {
        // Check if the user is logged in, if not redirect to log in page
        if (User.Identity.IsAuthenticated)
        {
            SetDepartureandArrival();
            return View();

        }
        else
            return RedirectToAction("../User/LogIn");
    }
    public void SetDepartureandArrival()
    {
            Departures.Add(new SelectListItem { Text = "-Select-", Value = "0" });
            Departures.Add(new SelectListItem { Text = "London", Value = "London" });
            Departures.Add(new SelectListItem { Text = "Manchester", Value = "Manchester" });
            Departures.Add(new SelectListItem { Text = "Edinburgh", Value = "Edinburgh" });
            Departures.Add(new SelectListItem { Text = "East Midlands", Value = "East Midlands" });
            Departures.Add(new SelectListItem { Text = "Bristol", Value = "Bristol" });
            ViewData["departures"] = Departures;

        Arrivals.Add(new SelectListItem { Text = "-Select-  ", Value = "0" });
        Arrivals.Add(new SelectListItem { Text = "Paris", Value = "Paris" });
        Arrivals.Add(new SelectListItem { Text = "Barcelona", Value = "Barcelona" });
        Arrivals.Add(new SelectListItem { Text = "Madrid", Value = "Madrid" });
        Arrivals.Add(new SelectListItem { Text = "Amsterdam", Value = "Amsterdam" });
        Arrivals.Add(new SelectListItem { Text = "Prague", Value = "Prague" });
        Arrivals.Add(new SelectListItem { Text = "Nice", Value = "Nice" });
        Arrivals.Add(new SelectListItem { Text = "Milan", Value = "Milan" });
        Arrivals.Add(new SelectListItem { Text = "Geneva", Value = "Geneva" });
        Arrivals.Add(new SelectListItem { Text = "Rome", Value = "Rome" });
        ViewData["arrivals"] = Arrivals;
    }
    [HttpPost]
    public ActionResult BookFlight(FlightDetailsMD flights, FormCollection form)
    {
        Random rand = new Random();
        Random rand2 = new Random();
        if (ModelState.IsValid)
        {
            var departureVal = form["departures"];
            var arrivalVal = form["arrivals"];
            using (var db = new FlightDetailsEntities())
            {
                var user = db.FlightDetails.Create();

                user.Id = rand.Next(100000, 199999) + rand2.Next(100000, 199999);
                user.Departure = departureVal;
                user.Arrivals = arrivalVal;
                user.DepartureDate = flights.DepartureDate;
                user.ReturnDate = flights.ReturnDate;

                db.FlightDetails.Add(user);
                db.SaveChanges();

                MailMessage mail = new MailMessage();
                mail.To.Add(User.Identity.Name);
                mail.From = new MailAddress(User.Identity.Name);
                mail.Subject = "Booking Confirmation";
                string Body = "Email from: <i>insert company name</i><br><br> Your booking is confirmed! You are going to " + user.Arrivals +
                    " on " + string.Format("{0:dd/MM/yyyy}", user.DepartureDate) + " and returning to " + user.Departure + " on " + string.Format("{0:dd/MM/yyyy}", user.ReturnDate) +
                    ".<br> Thank you for booking with us and we hope you have a nice time!" + "<br><h2>Reference #" + user.Id + "</h2>";
                mail.Body = Body;
                mail.IsBodyHtml = true;
                //SmtpClient client = new SmtpClient();
                using (SmtpClient client = new SmtpClient())
                {
                    client.EnableSsl = true;
                    client.UseDefaultCredentials = false;
                    client.Credentials = new NetworkCredential(User.Identity.Name, "RecurveBow");
                    client.Host = "smtp.live.com";
                    client.Port = 587;
                    client.DeliveryMethod = SmtpDeliveryMethod.Network;
                    client.Send(mail);
                }


                return RedirectToAction("BookingDetails", "Home");
            }
        }
         SetDepartureandArrival();
        return View();
    }

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 2018-09-11
    • 2014-01-12
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2017-04-02
    • 2013-10-17
    相关资源
    最近更新 更多