Een vervolgkeuzelijst met scheermesjes invullen uit een List<object> in MVC

Ik heb een model:

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;
        }
    }

En hier is de controller die de weergave laadt:

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

Ik kan de items in de lijst laten weergeven met een @foreach-lus zoals hieronder weergegeven:

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

Maar hoe vul ik een vervolgkeuzelijst met het model dat wordt doorgegeven, ik heb geprobeerd

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

maar ik heb geen geluk.


Antwoord 1, autoriteit 100%

U kunt uw bedrijfslogica opsplitsen in een weergavemodel, zodat uw weergave een schonere scheiding heeft.

Maak eerst een weergavemodel om de ID op te slaan die de gebruiker zal selecteren, samen met een lijst met items die in de DropDownzullen verschijnen.

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; }
}

Referenties:

Maak in de controller een methode om uw UserRole-lijst op te halen en transformeer deze in de vorm die in de weergave wordt weergegeven.

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);
}

Referenties:

Nu het weergavemodel is gemaakt, is de presentatielogica vereenvoudigd

Bekijken:

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

Referenties:

Dit levert het volgende op:

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

Antwoord 2, autoriteit 12%

 @Html.DropDownList("ddl",Model.Select(item => new SelectListItem
{
    Value = item.RecordID.ToString(),
    Text = item.Name.ToString(),
     Selected = "select" == item.RecordID.ToString()
}))

Antwoord 3, autoriteit 11%

Een manier zou kunnen zijn;

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

Antwoord 4, autoriteit 4%

Iets in de buurt van:

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

Je hebt een SelectList nodig om de DropDownListFor te vullen. Voor alle HTML-kenmerken die u nodig heeft, kunt u het volgende toevoegen:

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

Antwoord 5, autoriteit 3%

In plaats van een List<UserRole>, kunt u uw model een SelectList<UserRole>laten bevatten. Voeg ook een eigenschap toe SelectedUserRoleIdom… nou ja… de geselecteerde UserRole’s Id-waarde op te slaan.

Vul de SelectList in en gebruik vervolgens in uw weergave:

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

en het zou goed moeten komen.

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


Antwoord 6

Je aanroep van DropDownListForheeft nog een paar parameters nodig om het uit te werken. Je hebt een SelectList nodig zoals in de volgende SO-vraag:

MVC3 DropDownListFor – een eenvoudig voorbeeld?

Met wat je daar hebt, heb je alleen verteld waar de gegevens moeten worden opgeslagen, niet waar de lijst moet worden geladen.


Antwoord 7

  @{
        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>

Other episodes