5

Wenn Sie ein Domänenobjekt haben, das als Schnittstellensteuerung angezeigt werden soll, wie z. B. eine Dropdown-Liste, schlug ifwdev das Erstellen einer Erweiterungsmethode zum Hinzufügen einer .ToSelectList() vor.Wie wird eine C# -Erweiterungsmethode codiert, um ein Domain Model-Objekt in ein Interface-Objekt umzuwandeln?

Das Ursprungsobjekt ist eine Liste von Objekten mit Eigenschaften, die mit den Eigenschaften .Text und .Value der Dropdownliste identisch sind. Im Grunde ist es eine Liste von SelectList-Objekten, die nicht denselben Klassennamen haben.

Ich kann mir vorstellen, dass Sie mit Reflection das Domain-Objekt in ein Interface-Objekt verwandeln können. Jeder hat irgendwelche Vorschläge für C# -Code, der dies tun könnte? Die SelectList ist eine MVC-Dropdown-Liste von SelectListItem.

Die Idee ist natürlich so etwas wie dies in der Ansicht zu tun:

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

Durch Reflexion, meine ich die Eigenschaften des Quellobjekts lesen und sie zu den Select Eigenschaften entsprechen, eine richtige Dropdownauswahlliste zurück. –

Antwort

4

Es ist einfacher, den SelectList Teil Ihres ViewModel Objekt zu machen.

Wie auch immer, Sie müssen nur die IEnumerable durchlaufen und jedes Element zu einem neuen SelectList Objekt hinzufügen und es zurückgeben.

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 für die formatierten Auswahllistendaten im Ansichtsmodell. Es ist viel einfacher und viel einfacher zu testen. – Mark

+0

Wenn Sie bitte, haben Sie einen Link für das ViewModel-Muster? Sprechen wir darüber, für jede Ansicht zusätzlich zu den Domänenmodellen eine Klasse zu erstellen? Ich nehme an, das Repository wird keine von diesen zurückgeben, also verwenden Sie Fabriken, um die Ansichtsmodelle zu erstellen? –

+1

Hier gehts: http://nerddinnerbook.s3.amazonaws.com/Part6.htm. Das ViewModel ist ein Klassenobjekt, das alle Daten enthält, die Sie zum Rendern der Ansicht benötigen (einschließlich Optionen wie SelectLists). –

4

Dies sind die beiden Erweiterungsmethoden I Auswahllisten erstellen verwenden.

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

Verwandte Themen