在MVC中从List <object>填充razor下拉列表

我有一个模型:

public class DbUserRole { public int UserRoleId { get; set; } public string UserRole { get; set; } } public class DbUserRoles { public List<DbUserRole> GetRoles() { BugnetReports RoleDropDown = new BugnetReports(); List<DbUserRole> Roles = new List<DbUserRole>(); DataSet table = RoleDropDown.userRoleDropDown(); foreach (DataRow item in table.Tables[0].Rows) { DbUserRole ur = new DbUserRole(); ur.UserRole = Convert.ToString(item["UserRoleName"]); ur.UserRoleId = Convert.ToInt32(item["UserRoleID"]); Roles.Add(ur); } return Roles; } } 

这里是加载视图的控制器:

  // // GET: /Admin/AddNewUser public ActionResult AddNewUser() { DbUserRoles Roles = new DbUserRoles(); return View(Roles.GetRoles()); } 

我可以使用@foreach循环显示列表中的项目,如下所示:

 @foreach (var item in Model) { <tr> <td> @item.UserRoleId </td> <td> @item.UserRole </td> </tr> } 

但是,我如何使用通过的模型填充下拉列表,我试过了

@Html.DropDownListFor(x => x.UserRole)

但我没有运气。

你可以把你的业务逻辑分解成一个视图模型,这样你的视图就有了更清晰的分离。

首先创build一个视图模型来存储用户将select的Id以及将出现在DropDown中的项目DropDown

视图模型:

 public class UserRoleViewModel { // Display Attribute will appear in the Html.LabelFor [Display(Name = "User Role")] public int SelectedUserRoleId { get; set; } public IEnumerable<SelectListItem> UserRoles { get; set; } } 

参考文献:

  • DisplayAttribute

在控制器内部创build一个方法来获取您的UserRole列表并将其转换为将在视图中呈现的表单。

控制器:

 private IEnumerable<SelectListItem> GetRoles() { var dbUserRoles = new DbUserRoles(); var roles = dbUserRoles .GetRoles() .Select(x => new SelectListItem { Value = x.UserRoleId.ToString(), Text = x.UserRole }); return new SelectList(roles, "Value", "Text"); } public ActionResult AddNewUser() { var model = new UserRoleViewModel { UserRoles = GetRoles() }; return View(model); } 

参考文献:

  • SelectListItem
  • SelectList Constructor (IEnumerable, String, String)

现在视图模型已经创build,表示逻辑被简化了

视图:

 @model UserRoleViewModel @Html.LabelFor(m => m.SelectedUserRoleId) @Html.DropDownListFor(m => m.SelectedUserRoleId, Model.UserRoles) 

参考文献:

  • LabelExtensions.LabelFor
  • SelectExtensions.DropDownListFor

这将产生:

 <label for="SelectedUserRoleId">User Role</label> <select id="SelectedUserRoleId" name="SelectedUserRoleId"> <option value="1">First Role</option> <option value="2">Second Role</option> <option value="3">Etc...</option> </select> 
  @Html.DropDownList("ddl",Model.Select(item => new SelectListItem { Value = item.RecordID.ToString(), Text = item.Name.ToString(), Selected = "select" == item.RecordID.ToString() })) 

一种方法可能是;

  <select name="listbox" id="listbox"> @foreach (var item in Model) { <option value="@item.UserRoleId"> @item.UserRole </option> } </select> 

接近的东西:

 @Html.DropDownListFor(m => m.UserRole, new SelectList(Model.Roles, "UserRoleId", "UserRole", Model.Roles.First().UserRoleId), new { /* any html attributes here */ }) 

你需要一个SelectList来填充DropDownListFor。 对于您需要的任何HTML属性,您可以添加:

 new { @class = "DropDown", @id = "dropdownUserRole" } 

而不是一个List<UserRole> ,你可以让你的模型包含一个SelectList<UserRole> 。 还要添加一个属性SelectedUserRoleId来存储…以及选定的UserRole的Id值。

填写SelectList,然后在你的View中使用:

 @Html.DropDownListFor(x => x.SelectedUserRoleId, x.UserRole) 

你应该没事的

另见http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.108).aspx 。

您对DropDownListFor调用需要更多的参数来充实它。 你需要一个SelectList,如下面的SO问题所示:

MVC3 DropDownListFor – 一个简单的例子?

随着你在那里,你只告诉它在哪里存储数据,而不是从哪里加载列表。

  @{ List<CategoryModel> CategoryList = CategoryModel.GetCategoryList(UserID); IEnumerable<SelectListItem> CategorySelectList = CategoryList.Select(x => new SelectListItem() { Text = x.CategoryName.Trim(), Value = x.CategoryID.Trim() }); } <tr> <td> <B>Assigned Category:</B> </td> <td> @Html.DropDownList("CategoryList", CategorySelectList, "Select a Category (Optional)") </td> </tr>