型号:
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'。
我应该在这里改变什么?
答案 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函数并将所有信息添加到数据库中,同时它显示我之前写过的相同错误。