我正在尝试学习MVC ASP.Net,本教程中的一个步骤建议编写以下代码,将指定列表中的所有项目返回到下拉列表,允许用户选择所需的项目。
基本解释 下拉列表仅显示返回的当前项目,例如如果URL是详细信息/ 2 只有'比萨'将在列表中返回,而不是“菜单组”中的所有项目。名单。 基本解释
虽然下面的代码在某种程度上起作用,但它不像我在视频中显示的那样工作,我甚至走到网站并复制他的确切代码,但我仍然收到不同的结果,我不能找出原因。
正如您所看到的(如果您有时间观看视频,演示时间是3:49),将返回所有菜单组,我的代码仅显示通过URL传递的内容?
<dt>
Select a Menu Group
</dt>
<dd>
@Html.DropDownList("MenuGroup", new SelectList(Model.MenuGroups,
"MenuGroupId", "MenuGroupTitle"),
new { onchange = "selectMenuGroup()" })
</dd>
&#39; MenuGroups&#39;是一个从模型&#39;菜单&#39;创建的虚拟列表。
public virtual List<MenuGroup> MenuGroups { get; set; }
控制器如下:
public ActionResult FullDetails(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Menu menu = db.Menus.Find(id);
if (menu == null)
{
return HttpNotFound();
}
return View(menu);
}
如果这太长或遗漏任何信息道歉,我在发布之前已经查了好几个小时,但我只能找到人们说使用@ Html.DropDownListFor但我已经有了一个列表,所以我想使用上述方法(并找出我的错误)。
提前感谢任何建议。
答案 0 :(得分:0)
首先确保MenuGroups
包含所选记录的多个项目。
然后你可以做的是替换
public ActionResult FullDetails(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Menu menu = db.Menus.Find(id);
if (menu == null)
{
return HttpNotFound();
}
return View(menu);
}
与
public ActionResult FullDetails(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Menu menu = db.Menus.Include(r => r.MenuGroups).FirstOrDefault(r => r.Id == id);
if (menu == null)
{
return HttpNotFound();
}
return View(menu);
}
由于MenuGroups
是导航属性,因此您可以通过指定Include(r => r.MenuGroups)
来加载它。 AFAIK Find
仅返回不包含导航属性的实体,并且不能与Include
一起使用。 EF使用virtual
关键字的原因是允许在属性上进行延迟加载。有关详细信息,请参阅Lazy Loading vs Eager Loading。