'CategoryID'键的类型是'System.Int32',但必须是'IEnumerable '的类型'
问题描述:
保存我的产品时遇到了一些问题。 Dropdownlist正在填充,当我尝试保存时出现,我有一个标题中指出的错误。我读了很多关于它的文章,但其中的任何一篇都帮我解决了。什么会影响我的代码?有任何想法吗?'CategoryID'键的类型是'System.Int32',但必须是'IEnumerable <SelectListItem>'的类型'
控制器:
// GET: Admin/Products/Create
public ActionResult Create()
{
string domain = Request.Url.Host;
int clientid = (from a in db.Client where a.Domain == domain select a.ID).First();
int maxID = db.Product.Where(c => c.ClientID == clientid).Max(c => (int?)c.ProductID) ?? 0;
ViewBag.MaxID = maxID + 1;
List<SelectListItem> categories = new List<SelectListItem>();
foreach (var cat in db.Category.Where(c => c.ClientID == clientid))
{
categories.Add(new SelectListItem() { Text = cat.Name, Value = cat.CategoryID.ToString() });
}
ViewBag.Categories = categories;
return View();
}
// POST: Admin/Products/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,ProductID,Name,CategoryID,Price,Promotion,Image1,Image2,Image3,Image4,Description,ClientID")] Product product, HttpPostedFileBase file1, HttpPostedFileBase file2, HttpPostedFileBase file3, HttpPostedFileBase file4)
{
if (ModelState.IsValid)
{
if (file1 != null)
{
var fileName1 = Path.GetFileName(file1.FileName);
var path1 = Path.Combine(Server.MapPath("~/Images/Products/"), fileName1);
file1.SaveAs(path1);
@product.Image1 = Url.Content("~/Images/Products/" + fileName1);
}
if (file2 != null)
{
var fileName2 = Path.GetFileName(file2.FileName);
var path2 = Path.Combine(Server.MapPath("~/Images/Products/"), fileName2);
file2.SaveAs(path2);
@product.Image2 = Url.Content("~/Images/Products/" + fileName2);
}
if (file3 != null)
{
var fileName3 = Path.GetFileName(file3.FileName);
var path3 = Path.Combine(Server.MapPath("~/Images/Products/"), fileName3);
file3.SaveAs(path3);
@product.Image3 = Url.Content("~/Images/Products/" + fileName3);
}
if (file4 != null)
{
var fileName4 = Path.GetFileName(file4.FileName);
var path4 = Path.Combine(Server.MapPath("~/Images/Products/"), fileName4);
file4.SaveAs(path4);
@product.Image4 = Url.Content("~/Images/Products/" + fileName4);
}
string domain = Request.Url.Host;
int clientid = (from a in db.Client where a.Domain == domain select a.ID).First();
List<SelectListItem> categories = new List<SelectListItem>();
foreach (var cat in db.Category.Where(c => c.ClientID == clientid))
{
categories.Add(new SelectListItem() { Text = cat.Name, Value = cat.CategoryID.ToString() });
}
ViewBag.Categories = categories;
db.Product.Add(product);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(product);
}
DROPDOWNLIST在查看:
<div class="col-md-2">
<div class="form-group">
<label>Kategoria</label>
@Html.DropDownListFor(model => model.CategoryID, (IEnumerable<SelectListItem>)ViewBag.Categories, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
型号:
public partial class Product
{
public int ID { get; set; }
public int ProductID { get; set; }
public string Name { get; set; }
public int CategoryID { get; set; }
public decimal Price { get; set; }
public int Promotion { get; set; }
public string Image1 { get; set; }
public string Image2 { get; set; }
public string Image3 { get; set; }
public string Image4 { get; set; }
[DataType(DataType.MultilineText)]
[AllowHtml]
public string Description { get; set; }
public int ClientID { get; set; }
}
答
你没有设置ViewBag.Categories在您的文章,如果ModelState中是无效的。
移动你的选择列表中的代码块的IsValid
// POST: Admin/Products/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,ProductID,Name,CategoryID,Price,Promotion,Image1,Image2,Image3,Image4,Description,ClientID")] Product product, HttpPostedFileBase file1, HttpPostedFileBase file2, HttpPostedFileBase file3, HttpPostedFileBase file4)
{
if (ModelState.IsValid)
{
if (file1 != null)
{
var fileName1 = Path.GetFileName(file1.FileName);
var path1 = Path.Combine(Server.MapPath("~/Images/Products/"), fileName1);
file1.SaveAs(path1);
@product.Image1 = Url.Content("~/Images/Products/" + fileName1);
}
if (file2 != null)
{
var fileName2 = Path.GetFileName(file2.FileName);
var path2 = Path.Combine(Server.MapPath("~/Images/Products/"), fileName2);
file2.SaveAs(path2);
@product.Image2 = Url.Content("~/Images/Products/" + fileName2);
}
if (file3 != null)
{
var fileName3 = Path.GetFileName(file3.FileName);
var path3 = Path.Combine(Server.MapPath("~/Images/Products/"), fileName3);
file3.SaveAs(path3);
@product.Image3 = Url.Content("~/Images/Products/" + fileName3);
}
if (file4 != null)
{
var fileName4 = Path.GetFileName(file4.FileName);
var path4 = Path.Combine(Server.MapPath("~/Images/Products/"), fileName4);
file4.SaveAs(path4);
@product.Image4 = Url.Content("~/Images/Products/" + fileName4);
}
db.Product.Add(product);
db.SaveChanges();
return RedirectToAction("Index");
}
string domain = Request.Url.Host;
int clientid = (from a in db.Client where a.Domain == domain select a.ID).First();
List<SelectListItem> categories = new List<SelectListItem>();
foreach (var cat in db.Category.Where(c => c.ClientID == clientid))
{
categories.Add(new SelectListItem() { Text = cat.Name, Value = cat.CategoryID.ToString() });
}
ViewBag.Categories = categories;
return View(product);
}
之外,而你在它..既然你还缺少MaxID值,你可以只移动Viewbag代码到一个单独的方法所以您只需在返回视图之前调用该方法。
private void LoadCreateViewBagData()
{
string domain = Request.Url.Host;
int clientid = (from a in db.Client where a.Domain == domain select a.ID).First();
int maxID = db.Product.Where(c => c.ClientID == clientid).Max(c => (int?)c.ProductID) ?? 0;
ViewBag.MaxID = maxID + 1;
List<SelectListItem> categories = new List<SelectListItem>();
foreach (var cat in db.Category.Where(c => c.ClientID == clientid))
{
categories.Add(new SelectListItem() { Text = cat.Name, Value = cat.CategoryID.ToString() });
}
ViewBag.Categories = categories;
}
// GET: Admin/Products/Create
public ActionResult Create()
{
LoadCreateViewBagData();
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,ProductID,Name,CategoryID,Price,Promotion,Image1,Image2,Image3,Image4,Description,ClientID")] Product product, HttpPostedFileBase file1, HttpPostedFileBase file2, HttpPostedFileBase file3, HttpPostedFileBase file4)
{
if (ModelState.IsValid)
{
//yada yada
}
LoadCreateViewBagData();
return View(product);
}
先这样线程被建议作为相关似乎解决您的具体问题:http://stackoverflow.com/a/8596202/728795 – Andrei
是的,我发现了一个又一个太.. HTTP://计算器。 com/questions/27346367/the-viewdata-item-that-has-the-key-categoryid-is-of-type-system-int32-but-mu – JamieD77
它都不能解决我的问题......不幸的是。 – Ashiv3r