You can separate out your business logic into a viewmodel, so your view has cleaner separation.
First create a viewmodel to store the Id the user will select along with a list of items that will appear in the DropDown
.
ViewModel:
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; }
}
References:
DisplayAttribute
Inside the controller create a method to get your UserRole
list and transform it into the form that will be presented in the view.
Controller:
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);
}
References:
SelectListItem
SelectList Constructor (IEnumerable, String, String)
Now that the viewmodel is created the presentation logic is simplified
View:
@model UserRoleViewModel
@Html.LabelFor(m => m.SelectedUserRoleId)
@Html.DropDownListFor(m => m.SelectedUserRoleId, Model.UserRoles)
References:
LabelExtensions.LabelFor
SelectExtensions.DropDownListFor
This will produce:
<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()
}))
One way might be;
<select name="listbox" id="listbox">
@foreach (var item in Model)
{
<option value="@item.UserRoleId">
@item.UserRole
</option>
}
</select>
Something close to:
@Html.DropDownListFor(m => m.UserRole,
new SelectList(Model.Roles, "UserRoleId", "UserRole", Model.Roles.First().UserRoleId),
new { /* any html attributes here */ })
You need a SelectList to populate the DropDownListFor. For any HTML attributes you need, you can add:
new { @class = "DropDown", @id = "dropdownUserRole" }
Instead of a List<UserRole>
, you can let your Model contain a SelectList<UserRole>
. Also add a property SelectedUserRoleId
to store... well... the selected UserRole's Id value.
Fill up the SelectList, then in your View use:
@Html.DropDownListFor(x => x.SelectedUserRoleId, x.UserRole)
and you should be fine.
See also http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.108).aspx.
Your call to DropDownListFor
needs a few more parameters to flesh it out. You need a SelectList as in the following SO question:
MVC3 DropDownListFor - a simple example?
With what you have there, you've only told it where to store the data, not where to load the list from.
@{
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With