在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>