Popolamento di un elenco a discesa del razor da un elenco in MVC

Ho un modello:

public class DbUserRole { public int UserRoleId { get; set; } public string UserRole { get; set; } } public class DbUserRoles { public List GetRoles() { BugnetReports RoleDropDown = new BugnetReports(); List Roles = new List(); 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; } } 

Ed ecco il Controller che carica la vista:

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

Posso ottenere gli elementi nell’elenco da visualizzare utilizzando un ciclo @foreach come mostrato di seguito:

 @foreach (var item in Model) {   @item.UserRoleId   @item.UserRole   } 

Ma come faccio a popolare una lista a cascata con il modello che è passato, ho provato

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

ma non ho fortuna

Puoi separare la tua logica aziendale in un modello di visualizzazione, quindi la tua visione ha una separazione più chiara.

Prima crea un modello di visualizzazione per memorizzare l’Id che l’utente selezionerà insieme a un elenco di elementi che appariranno nel DropDown .

ViewModel:

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

Riferimenti:

  • DisplayAttribute

All’interno del controller creare un metodo per ottenere l’elenco UserRole e trasformarlo nel modulo che verrà presentato nella vista.

controller:

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

Riferimenti:

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

Ora che il viewmodel è stato creato, la logica di presentazione è semplificata

Vista:

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

Riferimenti:

  • LabelExtensions.LabelFor
  • SelectExtensions.DropDownListFor

Questo produrrà:

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

Un modo potrebbe essere;

   

Qualcosa vicino a:

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

È necessario un elenco di selezione per popolare DropDownListFor. Per gli attributi HTML necessari, puoi aggiungere:

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

Invece di un List , puoi lasciare che il tuo modello contenga una SelectList . Aggiungi anche una proprietà SelectedUserRoleId per archiviare … beh … il valore Id della UserRole selezionata.

Riempi la SelectList, poi nella tua vista usa:

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

e dovresti stare bene.

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

La tua chiamata a DropDownListFor bisogno di qualche parametro in più per arricchire. È necessario un elenco di selezione come nella seguente domanda SO:

MVC3 DropDownListFor – un semplice esempio?

Con quello che hai lì, hai solo detto dove memorizzare i dati, non dove caricare la lista da.

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