2009-08-31 7 views
0

J'essaie de "convertir" ceci en un modèle fortement typé au lieu de ViewData. Mais comment cela devrait-il ressembler?Création de Listbox avec une vue fortement typée?

je suis arrivé dans mon contrôleur:

public ActionResult UserEdit(int? userID) 
    { 
     User u; 

     if (userID == null) 
     { 
      u = new User(); 
     } 
     else 
     { 
      u = _us.GetUsers(userID.Value).First(); 
      u.Usergroups.Load(); 
     } 

     List<int> selectedUsergroupIDs = new List<int>(); 

     foreach (Usergroup item in u.Usergroups) 
     { 
      selectedUsergroupIDs.Add(item.UsergroupID); 
     } 

     MultiSelectList UsergroupID = new MultiSelectList(_ug.GetUsergroups(), "UsergroupID", "UsergroupName", selectedUsergroupIDs); 

     ViewData["UsergroupID"] = UsergroupID; 


     return View("UserEdit", new UserAdminEditViewModel { User = u, Usergroups = _ug.GetUsergroups() }); 
    } 

« UsergroupID » dans ce cas, ce qui est nécessaire d'ajouter dans mon modèle et à mon avis?

Merci à l'avance

/M

Répondre

1

Je ne sais pas, je comprends toute la question, mais si vous vous demandez ce que vous pouvez faire pour rendre ce modèle utilisable dans la page, assurez-vous la page hérite de ViewPage<UserAdminEditViewModel>. En outre, la classe MultiSelectList a les valeurs sélectionnées et non sélectionnées. Vous n'avez donc pas besoin d'avoir les deux dans le modèle de vue pour pouvoir les associer à un seul membre du modèle. Vous devrez changer UserAdminEditViewModel pour ressembler à ceci.

public class UserAdminEditViewModel 
{ 
    public User User { get; set; } 
    public IEnumerable<SelectListItem> UserGroups { get; set; } 
} 

A la fin de votre commande:

userGroups = new MultiSelectList(_ug.userGroups(), "Id", "Name", (from g in User.Usergroups select g.Id.Value).ToList()), new { size = 6 }) 
return View("UserEdit", new UserAdminEditViewModel { User = u, UserGroups = userGroups }); 

Ensuite, dans votre page vue:

<%@ Page Title="User Admin Edit" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<UserAdminEditViewModel>" %> 
<%-- ... --%> 

    <% using (Html.BeginForm()) {%> 

      <div> 
       <label for="Title">User name:</label> 
       <%= Html.TextBox("Title", Model.User.Username) %> 
      </div> 
      <div> 
       <label for="Groups">Groups:</label> 
       <%= Html.ListBox("SelectedGroups", Model.UserGroups)%> 
      </div> 
      <%-- ... --%> 
    <% } %> 
<%-- ... --%> 

Notez également que vous invoquer _ug.GetUsergroups() deux fois. Cela devrait disparaître avec cette solution, mais si vous avez encore besoin de la référencer, je vous recommande de la mettre en cache si vous ne la cachez pas dans la méthode elle-même afin de ne pas toucher la base de données chaque fois que vous en avez besoin. .

Je pense que cela répond à votre question. Si non, veuillez clarifier. De plus, je n'ai pas testé ce code donc il n'est pas garanti de le compiler mais ça devrait marcher.

+0

_ug.GetUsergroups() obtient tous les groupes d'utilisateurs, comment est-ce que j'applique les groupes sélectionnés dans "u.Usergroups" à cela afin qu'il obtienne le bon type etc? Plus de choses dans le modèle? –

+0

Cela fait partie de MultiSelectList. J'ai corrigé une erreur dans ce que j'ai fourni ci-dessus pour retourner la vue et ajouté un peu plus de code. – andymeadows

+0

Par une partie de MultiSelectList, la liste elle-même contient toutes les valeurs, puis les valeurs sélectionnées dans l'objet actuel. – andymeadows

Questions connexes