Html.DropDownListFor()没有显示选定的值

时间:2014-07-14 12:48:37

标签: entity-framework asp.net-mvc-4

我必须做错事,搜索谷歌和这种形式,但我找不到它。

我有以下课程'产品',用EF生成,代表数据库表'产品':

public partial class product
    {
        public product()
        {
            this.category = new HashSet<category>();
        }

        public string name { get; set; }
        public string description { get; set; }
        public decimal price { get; set; }

        public virtual ICollection<category> category { get; set; }
    }

我还有另一个类&#39;类别&#39;,也是用EF生成的,表示数据库表&#39;类别&#39;:

public partial class category
    {
        public category()
        {
            this.product = new HashSet<product>();
        }

        public string name { get; set; }

        public virtual ICollection<product> product { get; set; }
    }

数据库中的两个表具有多个关系,这个关系由名为product2category的链接表实现,该表包含category_name和product_name的组合PK。 category_name是[categroy.name]的外键。 product_name是[product.name]的外键(category.name是类别表中的PK.product.name是产品表中的PK)我首先使用数据库,并且没有EF生成的类名为product2category。

我有一个动作方法:

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, 
                    Selected = product.category.FirstOrDefault().name == o.name 
                }
            );
            ViewBag.categoryList = categoryList;
            return View(product);
        }

我插入了一个断点并调查了categoryList属性的值。它有3个结果(扩展结果视图时):

false,&#34; Football&#34;,&#34; Football&#34;

false,&#34;棒球&#34;,&#34;棒球&#34;

是的,&#34;网球&#34;,&#34;网球&#34;

我有以下观点(为简洁省略了一些HTML)

<div class="editor-label">
            @Html.LabelFor(model => model.category)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.category, (IEnumerable<SelectListItem>)ViewBag.categoryList)
            @Html.ValidationMessageFor(model => model.category)
        </div>

该视图会生成html下拉列表,但不会选择&#34; Tennis&#34;值。或者说,它没有设置所选的&#34;选择&#34;在Tennis选项标记处的属性(当然,我还在视图中插入了一个断点,以调查ViewBag.categoryList属性,但它提供与控制器中相同的结果):

<div class="editor-label">
  <label for="category">category</label>
</div>
<div class="editor-field">
  <select id="category" name="category">
    <option value="Baseball">Baseball</option>
    <option value="Football">Football</option>
    <option value="Tennis">Tennis</option>
  </select>
  <span class="field-validation-valid" data-valmsg-for="category" data-valmsg-replace="true"></span>
</div>

我找不到为什么它没有默认选择网球选项。

第二个问题:

我也无法编辑或创建产品,因为html select元素的name和id属性的值。该值设置为&#34; category&#34;但必须像category.name是我的信仰。

1 个答案:

答案 0 :(得分:0)

我相信你使用的是错误的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);
    }