在下拉列表中设置选定的值

时间:2011-05-23 20:50:50

标签: asp.net-mvc-2

大家好,我在其中一个页面上有下拉列表的奇怪错误!

我在3个下拉列表中使用了这样的代码:

//GetTypes returns collection of all availibale types from database 
      ViewData["Types"] = new SelectList(dataManager.IssueTypes.GetTypes(), "Id", "Title", issue.Type);

它很棒!

但是当我像这样使用它时:

// GetRoles returns collection of all availibale roles
ViewData["Roles"] = new SelectList(dataManager.Membership.GetRoles(), "RoleId", "RoleName",
                dataManager.Membership.GetUserRole(id));

它始终显示默认值! 我看了很多次debuger这个代码但是看起来很好! 将不胜感激任何帮助!

查看代码:

%: Html.DropDownList("RoleId", ViewData["Roles"] as IEnumerable<SelectListItem>)%>

2 个答案:

答案 0 :(得分:0)

我不知道你的dataManager.Membershop.GetUserRole(id)返回什么类型?

但您需要更改此调用中的第4个参数:

ViewData["Roles"] = new SelectList(dataManager.Membership.GetRoles(), "RoleId", "RoleName",
                dataManager.Membership.GetUserRole(id));

类似于:

ViewData["Roles"] = new SelectList(dataManager.Membership.GetRoles(), "RoleId", "RoleName",
                dataManager.Membership.GetUserRole(id).RoleId);

注意最后的RoleId?您指定为所选项目的对象应该是项目的Value属性的值 - 而不是整个对象。

答案 1 :(得分:0)

如何使用视图模型而不是ViewData?每当我看到有人使用ViewData时,我觉得自己有义务将此视为个人,我认为是最佳做法。

首先定义视图将使用的视图模型:

public class RolesViewModel
{
    public string SelectedRoleId { get; set; }
    public IEnumerable<SelectListItem> Roles { get; set; }
}

现在让我们转到控制器操作,该操作将填充此视图模型并将其传递给视图:

public ActionResult Foo(string id)
{
    var model = new RolesViewModel
    {
        SelectedRoleId = dataManager.Membership.GetUserRole(id),
        Roles = dataManager.Membership.GetRoles().Select(x => new SelectListItem
        {
            Value = x.RoleId,
            Text = x.RoleName
        })
    };
    return View(model);
}

好的,现在您应该确保SelectedRoleId表示Roles集合中存在的字符串值。这是预选下拉列表的内容。

最后是强类型视图:

<%= Html.DropDownListFor(
    x => x.SelectedRoleId, 
    new SelectList(Model.Roles, "Value", "Text")
)%>