MVC4 EF无法获得保存值以在页面加载的下拉中显示



我以前从未在stackoverflow上问过一个问题,但从未想过,但是我很拼命,所以我们走了:我无法获得保存的值以显示为默认值/在下拉列表中显示。

我在控制器中设置了列表:

public ActionResult Index()
{
    //User Dropdown List
    var users = Roles.GetUsersInRole("Manager");
    SelectList list = new SelectList(users);
    ViewBag.Users = list;
    return View();
}

然后,在视图中,管理员可以选择其中一个用户,然后通过EF保存到我的数据库中:

@Html.DropDownList("Users", ViewBag.Users as SelectList, "--Select Manager--")

这一切都很好,但是,当您编辑此条目时,我希望下拉列表显示当前保存的管理器,而不是列表中的名字。我希望我的编辑操作可以将当前管理器从数据库中拉出,并将其作为默认选定的项目传递到下拉列表中,但没有GO:

public ActionResult Edit(int id = 0)
{
    var theOwner = (from v in _db.Location where v.LocationID == id select v.Owner).FirstOrDefault();
    var users = Roles.GetUsersInRole("Manager");
    SelectList list = new SelectList(users, theOwner);
    ViewBag.Users = list;

从我在过去2周内阅读的所有示例中,每个人都有3种不同的值可以在其下拉列表中工作,从而可以在SelectList方法中使用所有过载。但是,我的问题是我只有此字符串列表,其中只有一个项目,所以我无法按照我想要的过载。
那么,有人知道我如何才能工作吗?预先感谢您的时间!

我很确定,如果您在创建选择列表的行上修改了第二个参数,则应该对我有用。

这是我认为的问题:当前您将第二个参数指定为" theowner",这是较早的linq语句中的对象引用。但是SelectList包含一堆字符串(与指定的rolename匹配的用户的用户名)。结果,选择列表不"知道"如何匹配您指定的selectedItem与它包含的字符串列表中的某些内容。

但是,如果您完善了第二个参数,因此它指定了您刚刚查找的所有者的用户名,则应该有效。但是,我不知道您的位置表中正确的属性名称是什么。如果您当前选择的字段(v.Owner)包含用户名本身而不是某些键,则语法将是:

SelectList list = new SelectList(users, theOwner.Owner);

如果该列实际上包含了诸如int或guid的用户的密钥,则使用键对用户名进行查询,但是修复的性质是相同的。

希望会有所帮助。

快速解决方法不使用 @html.dropdownlist,而是普通的html代码。

作为案例的示例,请在视图中使用以下HTML代码,而不是html.dropdownlist助手:

<!-- NOTE: the ID and name attributes of "select" tag should be the same as 
the name of the corresponding property in your Model in order for ASP.NET MVC
to edit your Model correctly! --> 
<select id="User" name="User">    
@foreach (var user in (SelectList)ViewBag.Users)
{
    if (user == ViewBag.TheOwner)
    {
        <option value="@user" text="@user" selected = "selected" />
    }
    else
    {
        <option value="@user" text="@user" />
    }
}
</select>

另外,要使此工作您需要在Edit方法中添加更多行:

ViewBag.TheOwner = theOwner;

也可以使用@Html.DropDownListFor()可以解决另一个解决方案,但是您尚未显示模型,因此我无法告诉您要确切使用什么。使用DropDownListFor时,ASP.NET MVC将根据模型中的值自动选择一个选项。

最新更新