Entity framework Html.DropDownListFor()未显示所选值

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”: 公共部分

我一定是做错了什么,搜索了谷歌和这个表单,但我找不到它

我使用EF生成了以下类“product”,表示数据库表“product”:

公共部分类乘积
{
公共产品()
{
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.name
code
只给所选属性一个布尔值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);
    }