DropDownListFor没有IEnumerable类型的ViewData项

时间:2016-08-03 11:33:16

标签: c# .net asp.net-mvc dropdownlistfor

型号:

public class Category
{
    [Key]
    public int ID { get; set; }

    [Required(ErrorMessage = "Kategoria jest wymagana!")]
    public string Kategoria { get; set; }

    [Required(ErrorMessage = "Kod jest wymagany!")]
    public string Kod { get; set; }
}

控制器:

public ActionResult DodajPrzedmiot()
{
    if (StaticFunctions.IfLogged())
    {
        using (var db = new DatabaseContext())
        {
            var cats = from b in db.Categories
                       select new { b.Kategoria };

            var x = cats.ToList().Select(c => new SelectListItem
            {
                Text = c.Kategoria,
                Value = c.Kategoria
            }).ToList();

            //List<SelectListItem> catList = new List<SelectListItem>();
            //foreach (var t in cats)
            //{
            //    SelectListItem s = new SelectListItem();
            //    s.Text = t.ToString();
            //    s.Value = t.ToString();
            //    catList.Add(s);
            //}
            ViewBag.Kategoria = x;
        }
        return View();
    }
    else
    {
        return RedirectToAction("Logowanie", "User");
    }
}

查看:

<div class="form-group">
        @Html.LabelFor(model => model.Kategoria, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Kategoria, null)
        </div>
    </div>  

问题是这个列表显示了我从数据库中选择的值,当我添加一个选中的项目时“Biurowe”类别它向数据库添加了信息,但同时它给了我错误:

  

发生了'System.InvalidOperationException'类型的异常   System.Web.Mvc.dll但未在用户代码中处理

     

其他信息:没有类型的ViewData项   'IEnumerable'有关键'Kategoria'。

我应该在这里改变什么?

3 个答案:

答案 0 :(得分:2)

@Html.DropDownListFor(model => model.Kategoria, null)中的第二个参数应该是您案例中ViewBag.Kategoria的项目列表。 我甚至建议您使用其他名称,例如ViewBag.KategoriaList。有时候,当ViewBag中的列表使用与绑定到DropDownList的属性相同的名称时,我遇到了问题。

试试这段代码:

public ActionResult DodajPrzedmiot()
    {
        if (StaticFunctions.IfLogged())
        {
            using (var db = new DatabaseContext())
            {
                var cats = from b in db.Categories
                           select new { b.Kategoria };

                var x = cats.ToList().Select(c => new SelectListItem
                {
                    Text = c.Kategoria,
                    Value = c.Kategoria
                }).ToList();

                ViewBag.KategoriaList = x;
            }
            return View();
        }
        else
        {
            return RedirectToAction("Logowanie", "User");
        }
    }

在视图中:

<div class="form-group">
        @Html.LabelFor(model => model.Kategoria, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Kategoria, ViewBag.KategoriaList as IEnumerable<SelectListItem>)
        </div>
    </div>  

您还必须填充ViewBag 操作中的POST。这是您的POST操作应该是:

[HttpPost]
    public ActionResult DodajPrzedmiot(Item itm)
    {
        if (ModelState.IsValid)
        {
            try
            {
                using (var db = new DatabaseContext())
                {
                    // try putting this code in a separate function and use that function in both actions to populate the ViewBag.
                    var cats = from b in db.Categories
                               select new { b.Kategoria };

                    var x = cats.ToList().Select(c => new SelectListItem
                    {
                        Text = c.Kategoria,
                        Value = c.Kategoria
                    }).ToList();

                    ViewBag.KategoriaList = x;

                    if (itm.Ilosc_zakupiona - itm.Ilosc_wypozyczona < 0) throw new ArgumentOutOfRangeException();
                    itm.Ilosc_magazynowa = itm.Ilosc_zakupiona - itm.Ilosc_wypozyczona;
                    db.Items.Add(itm);
                    db.SaveChanges();
                }
            }
            catch (System.Data.Entity.Infrastructure.DbUpdateException)
            {
                ViewBag.ErrorMessage = "Istnieje już przedmiot o takiej nazwie i/lub kodzie!";
                return View();
            }
            catch (ArgumentOutOfRangeException)
            {
                ViewBag.ErrorMessage = "Ilość zakupiona i/lub wypożyczona nie mogą być mniejsze od zera!";
                return View();
            }
        }
        return View();
    }

答案 1 :(得分:0)

@Html.DropDownListFor(model => model.Kategoria, (SelectList)ViewBag.KategoriaList)

答案 2 :(得分:0)

这是我的物品型号

public class Item
{
    [Key]
    public int ID { get; set; }

    [Display(Name = "Nazwa przedmiotu")]
    [Required(ErrorMessage = "Nazwa przedmiotu jest wymagana.")]
    public string Nazwa { get; set; }

    [Required(ErrorMessage = "Kategoria jest wymagana.")]
    public string Kategoria { get; set; }

    public string Magazyn { get; set; }

    [Required(ErrorMessage = "Kod jest wymagany.")]
    public string Kod { get; set; }

    [Display(Name = "Ilość zakupiona")]
    //[Required(ErrorMessage = "Ilość ogólna jest wymagana.")]
    public double Ilosc_zakupiona { get; set; }

    [Display(Name = "Ilość wypożyczona")]
    //[Required(ErrorMessage = "Ilość wypożyczona jest wymagana.")]
    public double Ilosc_wypozyczona { get; set; }

    [Display(Name = "Ilość magazynowa")]
    //[Required(ErrorMessage = "Ilość magazynowa jest wymagana.")]
    public double Ilosc_magazynowa { get; set; }

    [Display(Name = "Ilość zużyta")]
    //[Required(ErrorMessage = "Ilość zużyta jest wymagana.")]
    public double Ilosc_zuzyta { get; set; }

    [Display(Name = "Straty")]
    //[Required(ErrorMessage = "Straty są wymagane.")]
    public double Straty { get; set; }

    public string Sektor { get; set; }

    [Display(Name = "Półka")]
    public string Polka { get; set; }

    [Display(Name = "Pojemnik")]
    public string Pojemnik { get; set; }
}

和HttpPost功能

[HttpPost]
    public ActionResult DodajPrzedmiot(Item itm)
    {
        if (ModelState.IsValid)
        {
            try
            {
                using (var db = new DatabaseContext())
                {
                    if (itm.Ilosc_zakupiona - itm.Ilosc_wypozyczona < 0) throw new ArgumentOutOfRangeException();
                    itm.Ilosc_magazynowa = itm.Ilosc_zakupiona - itm.Ilosc_wypozyczona;
                    db.Items.Add(itm);
                    //db.Database.ExecuteSqlCommand("INSERT INTO Items(Nazwa_przedmiotu, Kategoria, Kod, Ilosc_ogolna, Ilosc_pozostala, Ilosc_wypozyczona, Wartosc, Sektor, Regal) VALUES({0},{1},{2},{3},{4},{5},{6},{7},{8},{9})", itm.Nazwa_przedmiotu, itm.Kategoria, itm.Kod, itm.Ilosc_ogolna, itm.Ilosc_pozostala, itm.Ilosc_wypozyczona, itm.Wartosc, itm.Sektor, itm.Regal);
                    db.SaveChanges();
                }
            }
            catch (System.Data.Entity.Infrastructure.DbUpdateException)
            {
                ViewBag.ErrorMessage = "Istnieje już przedmiot o takiej nazwie i/lub kodzie!";
                return View();
            }
            catch (ArgumentOutOfRangeException)
            {
                ViewBag.ErrorMessage = "Ilość zakupiona i/lub wypożyczona nie mogą być mniejsze od zera!";
                return View();
            }
        }
        return View();
    }

它传递给Post函数并将所有信息添加到数据库中,同时它显示我之前写过的相同错误。