我必须做错事,搜索谷歌和这种形式,但我找不到它。
我有以下课程'产品',用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是我的信仰。
答案 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);
}