@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,但我已经有一个列表,所以想使用上面的方法(也发现我的错误)。

提前感谢您的建议

@Html.下拉列表只返回1个值

首先确保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关键字的原因是允许延迟加载属性。