TOC

This article has been localized into German by the community.

Models:

ViewModels (Ansicht Modelle)

In diesem Lernprogramm haben wir bereits mehrmals mit Modellen gearbeitet. Wenn Sie sich jedoch in anderem Material zu ASP.NET MVC oder nur dem MVC-Muster im Allgemeinen umschauen, werden Sie möglicherweise feststellen, dass häufig ein sogenanntes "Ansichtsmodell" erwähnt wird. Aber was ist der Unterschied zwischen einem Modell und einem ViewModel? Wenn Sie ein Modell an eine Ansicht übergeben, wird es als ViewModel (Ansichtsmodell) betrachtet, da es von der Ansicht verwendet wird. Mit anderen Worten, es muss keinen Unterschied geben - Sie können Ihre Modelle gleich wie ViewModels verwenden.

Es gibt jedoch viele Situationen, in denen Sie ein bestimmtes ViewModel für eine bestimmte Ansicht erstellen möchten. Dies kann dazu dienen, ein vorhandenes Modell zu erweitern oder zu vereinfachen, oder weil Sie etwas in einer Ansicht darstellen möchten, die noch nicht von einem Ihrer Modelle abgedeckt wird.

ViewModels werden in Ihrem Projekt häufig in einem eigenen Verzeichnis namens "ViewModels" abgelegt. Auch dies ist nur eine Konvention, und da ViewModels nur reguläre .NET-Klassen sind, können Sie sie beliebig platzieren. Oft ist es jedoch sinnvoll, diese Konventionen zu befolgen. Einige Leute bevorzugen es auch, den Namen der Klasse mit dem Wort ViewModel nachzufixieren, z.B.: "AddressViewModel" oder "EditUserViewModel".

Wann sollte ein ViewModel verwendet werden?

Hier einige Situationen, in denen Sie von einem ViewModel profitieren können:

So stellen Sie etwas in einer Ansicht dar, das noch nicht in einem vorhandenen Modell enthalten ist: Wenn Sie ein Modell an eine Ansicht übergeben, können Sie z.B.: Ein String oder ein anderer einfacher Typ. Wenn Sie jedoch mehrere Werte übergeben möchten, ist es möglicherweise sinnvoller, ein einfaches ViewModel zu erstellen, in dem die Daten gespeichert werden.

public class AddressViewModel    
{    
public string StreetName { get; set; }    

public string ZipCode { get; set; }    
}

So greifen Sie über dieselbe Ansicht auf die Daten mehrerer Modelle zu: Dies ist in vielen Situationen relevant, z.B.: Wenn Sie ein FORMULAR erstellen möchten, in dem Sie die Daten mehrerer Modelle gleichzeitig bearbeiten können. Sie könnten dann ein ViewModel wie folgt erstellen:

public class EditItemsViewModel      
{  
public Model1Type Model1 { get; set; }      

public Model2Type Model2 { get; set; }      
}

So vereinfachen Sie ein vorhandenes Modell: Stellen Sie sich vor, Sie haben eine große Klasse mit Informationen zu einem Benutzer. Vielleicht sogar sensible Informationen wie Passwörter. Wenn Sie diese Informationen in einer Ansicht anzeigen möchten, kann es sinnvoll sein, nur die Teile anzuzeigen, die Sie tatsächlich benötigen. Beispielsweise können Sie ein kleines Widget haben, das anzeigt, dass der Benutzer angemeldet ist, welchen Benutzernamen er hat und wie lange er angemeldet war. Anstatt Ihr gesamtes Benutzermodell zu übergeben, können Sie ein viel schlankeres ViewModel übergeben, das entworfen wurde speziell für diesen Zweck:

public class SimpleUserInfoViewModel   
{
    public string Username { get; set; }

    public TimeSpan LoginDuration { get; set; }  
}

So erweitern Sie ein vorhandenes Modell mit Daten, die nur für die Ansicht relevant sind: Andererseits enthält Ihr Modell manchmal weniger Informationen, als Sie in Ihrer Ansicht benötigen. Ein Beispiel hierfür könnte sein, dass Sie einige Annehmlichkeitseigenschaften oder Methoden wünschen, die nur für die Ansicht und nicht für Ihr Modell im Allgemeinen relevant sind, wie in diesem Beispiel, in dem wir ein Benutzermodell (genannt WebUser) mit einer LoginDuration-Eigenschaft erweitern, die aus der LastLogin DateTime-Eigenschaft berechnet wird, die bereits in der WebUser-Klasse gefunden wurde:

public class WebUser    
{    
public DateTime LastLogin { get; set; }    
}

Von da an gibt es zwei Möglichkeiten: Sie können diese Klasse erweitern (von ihr erben) oder eine Eigenschaft für die WebUser-Instanz im ViewModel hinzufügen. So wie hier:

public class UserInfoViewModel
{
    public WebUser User { get; set; }

    public TimeSpan LoginDuration
    {
get
{
    return DateTime.Now - this.User.LastLogin;
}
    }
}

Oder so:

public class ExtendedUserInfoViewModel : WebUser
{
    public TimeSpan LoginDuration
    {
get
{
    return DateTime.Now - this.LastLogin;
}
    }
}

Zusammenfassung

Ein ViewModel ist im Grunde genommen nur ein Modell, das an eine Ansicht übergeben wird. Wie in diesem Artikel erläutert, gibt es viele Möglichkeiten, dies zu tun. Sie können entweder ein vorhandenes Modell wie es ist verwenden oder ein neues erstellen, spezifisch für die Frageansicht.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!