5

Lorsque vous avez un objet de domaine qui doit être affiché en tant que contrôle d'interface, comme une liste déroulante, ifwdev a suggéré de créer une méthode d'extension pour ajouter un .ToSelectList().Comment coder une méthode d'extension C# pour transformer un objet Modèle de domaine en objet Interface?

L'objet d'origine est une liste d'objets qui ont des propriétés identiques aux propriétés .Text et .Value de la liste déroulante. Fondamentalement, il s'agit d'une liste d'objets SelectList, mais pas du même nom de classe.

J'imagine que vous pourriez utiliser la réflexion pour transformer l'objet de domaine en objet d'interface. Quelqu'un at-il des suggestions pour le code C# qui pourrait le faire? SelectList est une liste déroulante MVC de SelectListItem.

L'idée est bien sûr de faire quelque chose comme cela dans la vue:

<%= Html.DropDownList("City", 
     (IEnumerable<SelectListItem>) ViewData["Cities"].ToSelectList()) 
+0

par réflexion, je veux dire lire les propriétés de l'objet source et les faire correspondre aux propriétés SelectList, retourner une liste de sélection DropDownList appropriée. –

Répondre

4

Il est plus facile de faire la SelectList partie de votre objet ViewModel.

De toute façon, il vous suffit de parcourir le IEnumerable et ajouter chaque élément à un nouvel objet SelectList et le renvoyer.

public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption) 
{ 
    var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList(); 
    items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" }); 
    return items; 
} 

How to refactor these 2 similar methods into one?

+2

+1 pour avoir les données de liste de sélection formées dans le modèle de vue. C'est beaucoup plus facile et beaucoup plus facile à tester. – Mark

+0

S'il vous plaît, avez-vous un lien pour le modèle ViewModel? Parlons-nous de faire une classe pour chaque vue en plus des modèles de domaine? Je suppose que le référentiel ne renverra aucun d'entre eux, alors utilisez-vous des usines pour créer les modèles de vue? –

+1

Voilà: http://nerddinnerbook.s3.amazonaws.com/Part6.htm. ViewModel est un objet de classe qui contient toutes les données dont vous avez besoin pour afficher la vue (y compris des éléments comme SelectLists). –

4

Ce sont les deux méthodes d'extension que j'utilise pour créer des listes de sélection.

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value) 
{ 
    return collection.ToSelectList(text, value, x => false); 
} 

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value, Func<T, bool> selected) 
{ 
    return (from item in collection 
      select new SelectListItem() 
         { 
          Text = text(item), 
          Value = value(item), 
          Selected = selected(item) 
         }); 
} 

HTHS,
Charles

Questions connexes