2009-06-24 1 views
2

In meinem ASP.NET MVC Projekt habe ich eine polymorphe Sammlung, die ich rendern möchte - sagen wir, ein IEnumerable<ISomething> wo die einzelnen Elemente eine Mischung aus verschiedenen Implementierungen von ISomething sein können.Hat ASP.NET MVC etwas, das mit der DataTemplate-Funktion von WPF vergleichbar ist?

Ich möchte, dass diese Liste gerendert wird, wobei jeder konkrete Typ nach einer eigenen Vorlage rendert (vielleicht ein stark typisiertes ViewUserControl).

In WPF könnte ich DataTemplates angeben, die konkrete Typen automatisch an bestimmte Vorlagen binden. Kann ich etwas ähnliches in ASP.NET MVC tun?

Offensichtlich kann ich durch die Liste iterieren und eine Besetzung mit dem Schlüsselwort is versuchen und dann viele if Anweisungen verwenden, um die gewünschte Kontrolle zu rendern, aber ich hoffte auf etwas eleganteres (wie WPF).

Antwort

0

Ich bin mir nicht sicher, ob ich dich vollständig bekomme, aber warum implementierst du nicht eine Methode zu deiner ISomething-Oberfläche wie zum Beispiel Render, die vertraglich auf all deine anderen konkreten Entitäten implementiert wird, und dann Iteriere jedes Element in der polymorphen Sammlung und rufe es auf.

+0

Weil das bedeuten würde, dass UI-spezifischer Code in die ISomething-Schnittstelle eindringt. Ihr Vorschlag hat jedoch Vorteile auf der Ebene, auf der ich eine neue Schnittstelle definieren könnte, die die Objekte kapselt und ein View-Modell für jedes Objekt mit einer zugehörigen View-Kennung definiert (wie eine Methode, wie Sie es vorgeschlagen haben). Dies könnte funktionieren, ist aber immer noch ein wenig klobig im Vergleich zu WPF's Art, es zu tun. –

0

Ich hatte ein ähnliches Problem und fand nie eine "einfache" Antwort. Ich hatte den Vorteil zu wissen, dass alle Elemente in der Liste auf die gleiche Weise rendern würden, also habe ich einen Decorator für ISomething erstellt, die Liste mithilfe von Code aus dem Umbrella-Projekt in IEnumerable konvertiert und dann die relevanten Teile extrahiert. Kinda wie folgt aus:

public interface ISomethingDecorator 
{ 
    string Description { get; } 
    string[] Actions { get; } 
} 

public class BigSomethingDecorator : ISomethingDecorator { /* ... */ } 
public class SmallSomethingDecorator : ISomethingDecorator { /* ... */ } 

Dann, wie gesagt, verwende ich das Umbrella-Projekt zur Umstellung auf ISomethingDecorator ISomething und kehrte in die Ansicht IEnumerable.

Ich weiß nicht, ob es Ihnen bei dem helfen wird, was Sie vorhaben - vor allem, weil Sie einen Monat zu spät sind - aber ich dachte, ich würde Sie wissen lassen, wie ich damit umgegangen bin. Wenn Sie völlig verschiedene Formate anzeigen, wird es wahrscheinlich nicht ausreichen, aber vielleicht kann es Ihnen einen Ausgangspunkt geben.