0

我以前从未在 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--")

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

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;

从我在过去两周阅读的所有示例中,每个人都有 3 个不同的值可以在他们的下拉列表中使用,这使得在 SelectList 方法中使用所有重载成为可能。但是,我的问题是我只有这个字符串列表,其中只有一个项目,所以我不能根据需要使用重载。
那么有没有人知道我如何才能让它发挥作用?非常感谢您抽出宝贵的时间!

4

2 回答 2

1

我很确定,如果您修改创建 SelectList 的行上的第二个参数,它应该可以工作——它对我有用。

这就是我认为的问题所在:目前您将第二个参数指定为“theOwner”,这是来自早期 Linq 语句的对象引用。但是 SelectList 包含一堆字符串(与指定角色名匹配的用户的用户名)。因此,SelectList 不“知道”如何将您指定为 SelectedItem 的内容与其包含的字符串列表中的内容相匹配。

但是,如果您优化第二个参数,使其指定您刚刚查找的所有者的用户名,它应该可以工作。但是,我不知道您的 Location 表中正确的属性名称是什么。如果您当前选择的字段 ( v.Owner) 包含 UserName 本身而不是某个 Key,则语法为:

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

如果该列实际上包含用户的键,例如 int 或 Guid,那么您将使用该键查询 UserName,但修复的性质是相同的。

希望有帮助。

于 2012-12-22T17:58:46.237 回答
0

一个快速的解决方法是不使用 @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 将根据模型中的值自动选择一个选项。

于 2012-12-22T10:55:47.900 回答