@Html.下拉列表只返回1个值
本文关键字:1个值 返回 下拉列表 @Html | 更新日期: 2023-09-27 18:17:26
我正在尝试学习MVC ASP。Net中,教程中的一个步骤建议编写以下代码,将指定列表中的所有项返回到一个下拉列表中,允许用户选择所需的项。
基本解释下拉列表只显示当前返回的项目,例如,如果URL是details/2只有"Pizza"在列表中返回,而不是"MenuGroups"列表中的所有项目。
虽然下面的代码确实在一定程度上工作,但它不像我在视频中显示的那样工作,我甚至去了网站并复制了他的确切代码,但我仍然收到不同的结果,我不知道为什么。
http://cop4834.pbworks.com/w/page/106053825/Menu%20Case%20Study%20Part%204%20-%20Generating%20a%20Javascript%20call%20from%20a%20Razor%20Object正如你所看到的(如果你有时间观看视频,演示是在3:49)所有菜单组返回,我的代码只显示通过URL传入的任何内容?
<dt>
Select a Menu Group
</dt>
<dd>
@Html.DropDownList("MenuGroup", new SelectList(Model.MenuGroups,
"MenuGroupId", "MenuGroupTitle"),
new { onchange = "selectMenuGroup()" })
</dd>
'MenuGroups'是一个从模型'Menu'创建的虚拟列表
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,但我已经有一个列表,所以想使用上面的方法(也发现我的错误)。
提前感谢您的建议
首先确保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
关键字的原因是允许延迟加载属性。