2013-02-19 84 views
1

最終解決方案:的SelectList選定值

public class UpdateUser 
{ 
    public IEnumerable<string> SelectedRoles { get; set; } 
    public IEnumerable<SelectListItem> DropDownRoles { get; set; } 
} 

...

var roles = context.Roles.Select(x => x.RoleName).ToList(); 
UpdateUser userToUpdate = new UpdateUser 
{ 
    SelectedRoles = user.Roles.Select(x => x.RoleName), 
    DropDownRoles = new SelectList(roles, user.Roles) 
}; 

HTML

@Html.ListBoxFor(x => x.SelectedRoles, Model.DropDownRoles) 

============ =============

我有一個droplist顯示,像這樣的用戶角色:

HTML

@Html.TextBoxFor(x => x.Roles) 
    @Html.DropDownList("roles", ViewData["roles"] as SelectList) 

控制器

var user = context.Users.Include(x => x.Roles).Where(x => x.UserId == id).FirstOrDefault(); 
ViewData["roles"] = new SelectList(context.Roles, "RoleId", "RoleName"); 

的問題是,我不明白我怎麼能設置在下拉菜單中選擇的值。我想也許我可以使用Lambda Expression將匹配的角色放在列表頂部,然後按字母順序放置。

 var roles = context.Roles 
      .ToList() 
      .OrderBy(? matching role then other selectable roles ?) 

必須是一個更簡單的方法?

回答

4

請勿使用與ViewData鍵相同的值和下拉列表中選定的值。試試這樣:

@Html.DropDownList("selectedRole", ViewData["roles"] as SelectList) 

,然後你的POST控制器動作可以以此爲參數:

[HttpPost] 
public ActionResult Index(string selectedRole) 
{ 
    ... 
} 

,如果你有你的表單內的其他領域,你可以將它們在一個視圖模型組:

public class MyViewModel 
{ 
    public string SelectedRole { get; set; } 
    public string SomeOtherField { get; set; } 
} 

然後讓您的控制器操作將此視圖模型作爲參數。而且因爲現在你有一個視圖模型讓我們它充分利用和擺脫可怕的弱類型ViewData

public class MyViewModel 
{ 
    public string SelectedRole { get; set; } 
    public IEnumerable<SelectListItem> Roles { get; set; } 

    public string SomeOtherField { get; set; } 
    public string YetAnotherField { get; set; } 
} 

,然後你可以有GET操作填充此視圖模型:

public ActionResult Index() 
{ 
    var model = new MyViewModel(); 
    model.Roles = new SelectList(context.Roles, "RoleId", "RoleName"); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Index(MyViewModel model) 
{ 
    ... 
} 

,然後你的看法可能是強類型的視圖模型:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    ... 
    @Html.DropDownListFor(x => x.SelectedRole, Model.Roles) 
    ... 
    <button type="submit">OK</button> 
} 
+0

怎麼樣,如果用戶擁有比1起的作用嗎? 'public IEnumerable SelectedRole {get;組; }所以,對於每個用戶角色,我們都有一個新的下拉列表。 – user1883004 2013-02-19 09:58:32

+0

準確地說:'public IEnumerable SelectedRoles {get;組; }'。然後在視圖中使用'Html.ListBoxFor(x => x.SelectedRoles,Model.Roles)'而不是'Html.DropDownListFor(x => x.SelectedRole,Model.Roles)'來允許多選。 – 2013-02-19 09:59:47

+0

感謝您的幫助,幾乎在那裏,我只需要設置所選的值, 讓我編輯OP。 – user1883004 2013-02-19 10:13:56

0

SelectList包含SelectListItem對象,每個對象的列表有一個Selected屬性。所以你可以做這樣的事情:

var user = context.Users.Include(x => x.Roles).Where(x => x.UserId == id).FirstOrDefault(); 
var temp = new SelectList(context.Roles, "RoleId", "RoleName"); 
temp.First(x => x.Value.Equals(IdOfSelectedObject)).Selected = true; 
ViewData["roles"] = temp; 
1

達林的答案是完整和清晰的,它幫助我在我的搜索。 但是,我只需要爲強類型視圖再添加一個。在我的項目中,我爲特定用戶填充了一個SelectList和某些角色。這些角色已存儲在數據庫中。編輯時(更改包含此角色的用戶屬性),我希望將最初配置的角色顯示爲選定的值。

要做到這一點,只是完成達林他的答案通過調整一件事的看法(我離開了我自己的模型,但它幾乎是一樣的,你可以從例子搞清楚):

model MyViewModel 
@using (Html.BeginForm()) 
{ 
    ... 
    @{ 
     var selectedItem = Model.Roles.Where(role => role.Value.AsInt().Equals(...).FirstOrDefault(); 
     var selectedText = selectedItem != null ? selectedItem.Text : null; 
     Html.DropDownListFor(x => x.SelectedRole, Model.Roles, selectedText) 
    } 

    ... 
    <button type="submit">OK</button> 
} 

的selectedText被認爲是如所描述的hereoptionLabel,這將始終把下拉列表中當前所選的值第一位。

也許一點點晚了,但我希望它可以幫助別人了:)