Entity framework Html.DropDownListFor()未显示所选值
我一定是做错了什么,搜索了谷歌和这个表单,但我找不到它 我使用EF生成了以下类“product”,表示数据库表“product”:Entity framework Html.DropDownListFor()未显示所选值,entity-framework,asp.net-mvc-4,Entity Framework,Asp.net Mvc 4,我一定是做错了什么,搜索了谷歌和这个表单,但我找不到它 我使用EF生成了以下类“product”,表示数据库表“product”: 公共部分类乘积 { 公共产品() { this.category=new HashSet(); } 公共字符串名称{get;set;} 公共字符串说明{get;set;} 公共十进制价格{get;set;} 公共虚拟ICollection类别{get;set;} } 我还有另一个类“category”,也是用EF生成的,表示数据库表“category”: 公共部分
公共部分类乘积
{
公共产品()
{
this.category=new HashSet();
}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共十进制价格{get;set;}
公共虚拟ICollection类别{get;set;}
}
我还有另一个类“category”,也是用EF生成的,表示数据库表“category”:
公共部分类类别
{
公共类别()
{
this.product=new HashSet();
}
公共字符串名称{get;set;}
公共虚拟ICollection产品{get;set;}
}
数据库中的两个表有一个多对多关系,由一个名为product2category的链接表实现,该表包含category_name和product_name的组合主键。category_name是[categroy.name]的外键。product_name是[product.name](category.name是category表中的主键。product.name是product表中的主键)的外键。我首先使用数据库,没有名为product2category的EF生成类
我有一个行动方法:
公共操作结果编辑(字符串id=null)
{
product product=db.product.Find(id);
如果(产品==null)
{
返回HttpNotFound();
}
IEnumerable categoryList=db.category
托利斯先生()
.Select(o=>new SelectListItem(){
Value=o.name,
Text=o.name,
所选=product.category.FirstOrDefault().name==o.name
}
);
ViewBag.categoryList=类别列表;
返回视图(产品);
}
我插入了一个断点并研究了categoryList属性的值。它有3个结果(展开“结果”视图时):
错,“足球”,“足球”
假,“棒球”,“棒球”
没错,“网球”,“网球”
我有以下观点(为了简洁起见省略了一些HTML)
@LabelFor(model=>model.category)
@Html.DropDownListFor(model=>model.category,(IEnumerable)ViewBag.categoryList)
@Html.ValidationMessageFor(model=>model.category)
该视图生成html下拉列表,但不选择“网球”值。或者说,它没有在网球选项标记处设置selected=“selected”属性(当然,我也在视图中插入了一个断点,以调查ViewBag.categoryList属性,但它给出的结果与控制器中的结果相同):
类别
棒球
足球
网球
我找不到它为什么不默认选择网球选项。
第二个问题:
我也无法编辑或创建产品,因为html select元素的name和id属性的值无效。该值设置为“category”,但必须与category类似。我相信名称是正确的。我相信您使用的SelectListItem是错误的 Selected是一个布尔值,表示该项已被选中。 DropDownListFor应该在html中获取所选值,您已经在这样做了
// Model.Category is giving it the current selected value
@Html.DropDownListFor(model => model.category, (IEnumerable<SelectListItem>)ViewBag.categoryList)
public ActionResult Edit(string id = null)
{
product product = db.product.Find(id);
if (product == null)
{
return HttpNotFound();
}
IEnumerable<SelectListItem> categoryList = db.category
.ToList()
.Select(o => new SelectListItem() {
Value = o.name,
Text = o.name //, REMOVE THE SELECTED LINE
//Selected = product.category.FirstOrDefault().name == o.name
}
);
ViewBag.categoryList = categoryList;
return View(product);
}
//Model.Category为其提供当前选定的值
@Html.DropDownListFor(model=>model.category,(IEnumerable)ViewBag.categoryList)
公共操作结果编辑(字符串id=null)
{
product product=db.product.Find(id);
如果(产品==null)
{
返回HttpNotFound();
}
IEnumerable categoryList=db.category
托利斯先生()
.Select(o=>new SelectListItem(){
Value=o.name,
Text=o.name/,删除所选行
//所选=product.category.FirstOrDefault().name==o.name
}
);
ViewBag.categoryList=类别列表;
返回视图(产品);
}
谢谢,但是code
Selected=product.category.FirstOrDefault().name==o.namecode
只给所选属性一个布尔值false或true。还有其他人有建议吗?您是否尝试在括号中关闭Selected=(product.category.FirstOrDefault().name==o.name)
// Model.Category is giving it the current selected value
@Html.DropDownListFor(model => model.category, (IEnumerable<SelectListItem>)ViewBag.categoryList)
public ActionResult Edit(string id = null)
{
product product = db.product.Find(id);
if (product == null)
{
return HttpNotFound();
}
IEnumerable<SelectListItem> categoryList = db.category
.ToList()
.Select(o => new SelectListItem() {
Value = o.name,
Text = o.name //, REMOVE THE SELECTED LINE
//Selected = product.category.FirstOrDefault().name == o.name
}
);
ViewBag.categoryList = categoryList;
return View(product);
}