@ Html.DropDownList只返回1个值

时间:2016-11-10 23:29:22

标签: c# asp.net asp.net-mvc

我正在尝试学习MVC ASP.Net,本教程中的一个步骤建议编写以下代码,将指定列表中的所有项目返回到下拉列表,允许用户选择所需的项目。

基本解释 下拉列表仅显示返回的当前项目,例如如果URL是详细信息/ 2 只有'比萨'将在列表中返回,而不是“菜单组”中的所有项目。名单。 基本解释

虽然下面的代码在某种程度上起作用,但它不像我在视频中显示的那样工作,我甚至走到网站并复制他的确切代码,但我仍然收到不同的结果,我不能找出原因。

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>

&#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但我已经有了一个列表,所以我想使用上述方法(并找出我的错误)。

提前感谢任何建议。

1 个答案:

答案 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

相关问题