none
[MVC2] Models & ViewModels RRS feed

  • Frage

  • Hallo.

    Für die FrontEnd-Formularvalidierung nutze ich eine Model-Klasse (ViewModel).

    Die speichert z.B.: id, name, email, timestamp, phone

    Nun nutze ich gleichzeitig aber auch normale Models in denen die Logik verankert ist sowie ein, ich drücke es mal so aus: "Mindestanforderungs-Model".

    Dieses Minddestanforderungs-Model benötigt NUR die Informationen (required) die für die logik wirklich notwendig sind.

    Die zusätzlichen, von dem ViewModel vorrausgesetzen (required) Daten, sollen das Model nicht weiter interessieren.

    Der Sinn dahinter:

    Der Nutzer muss um ein Formular auszufüllen z.B. ein Captcha angeben.
    Das Viewmodel benötigt dann also das captcha, das Model mit den mindestanforderungen jedoch benötigt das captcha nicht.

    Da fällt mir doch gerade ein wo ich hier schreibe, kann ich nicht das ViewModel von dem eigentlichen Model erben lassen?
    Falls die geerbten Informationen dennoch einmal nicht exakt gleich sein können/müssen/sollen, kann ich diese ja in der ViewModel einfach überschreiben.

    Frage:
    Wie kann ich das Viewmodel auf das mindestanforderungsmodel legen, ohne dabei Fehler zu riskieren, da das Model nicht alle Variablen wie das viewmodel besitzt?

    Und: Ist die Idee mit dem Erben sinnfrei? Stolperfalle?

    Vielen Dank

    Dienstag, 17. Juli 2012 13:44

Antworten

  • Ich persönlich glaube nicht, dass Vererbung hier der richtige Weg ist. Eine derartige "Verknüpfung" zwischen View und Business Logik finde ich wenig hilfreich.

    Zwei Ansätze die hier meines Erachtens besser passen würden:

    1. Copy Constructor (http://msdn.microsoft.com/en-us/library/ms173116(v=vs.80).aspx)

    2. Object to Object Mapper (z.B. https://github.com/AutoMapper/AutoMapper)

    In beiden Szenarien hast du Klassen/Objekte, die mehr oder minder unabhängig voneinander sind.

    Abgesehen von deinem geplanten Vorhaben könntest du ja auch einfach auf die Verwendung zweier Models verzichten und nur ein Einziges nutzen. Die überflüssigen Werte "verfallen" ja mit dem dispose des Objekts, sofern sie nicht irgendwo z.B. in eine DB geschrieben werden. Warum so kompliziert wenn es auch einfach geht ;)

    Gruß Sebastian



    Mittwoch, 18. Juli 2012 16:05

Alle Antworten

  • PS:
    Es wird nur ein ViewModel erstellt, wenn weitere Informationen benötigt werden.
    Ansonsten wird direkt mit dem Model gearbeitet!

    Dienstag, 17. Juli 2012 13:59
  • Hallo ActiveServerPage,

    ich verstehe jetzt wohl das Problem nicht ganz. Wenn du ein Model mit den Feldern "Name", "Vorname" und "Geburtsdatum" hast und ein ViewModel mit "Name" und "Vorname", dann kannst du diese Werte ja in das Model übernehmen - Geb.Datum bleibt mangels Info aber leer. Wenn eine Funktion in der weiteren Ausführung aber dieses Feld (Geb.Datum) benötigt läufst du direkt in einen Fehler... So auch umgekehrt: Hast du zuviel Info in deinem ViewModel (z.B. Captcha - was ich persönlich im Speziellen aber nicht für sinnvoll halte es ins ViewModel einzubauen) dann wirfst du die Werte einfach weg.

    Was meinst du mit "Viewmodel auf das mindestanforderungsmodel legen"? Dieser Part bleibt ja dir innerhalb des Controllers überlassen.

    Gruß Sebastian

    Mittwoch, 18. Juli 2012 13:52
  • Ich erkläre es nochmal genauer.

    Beispiel:

    AccountModels.cs
    class AccountCreateModel
    [required] prop name
    [required] prop email
    [required] prop password
    (Hier sind nur die properties, welche wirklich nur gebraucht werden.
    (also kein Captcha oder dergleichen) Oder wie von mir beschrieben "mindestanforderungsmodel")

    AccountViewModels.cs
    class AccountCreateViewModel
    [required] prop name
    [required] prop email
    [required] prop password
    [required] prop captcha
    (Hier sind die properties die später das AccountCreateModel benötigt INKL. weiterer properties, die für validierung oder sonstigem gebraucht werden, jedoch das AccountCreateModel garnicht benötigt.)

    Somit hast du es schon richtig benannt, z.B. den prop "captcha" bei der übergabe des AccountCreateViewModels an das AccountCreateModel einfach zu verwerfen weil dieser nun nicht mehr gebraucht wird da zuvor z.B. im Controller eine validierung des captchas erfolgte, erfolgreich war und somit wegfallen kann.

    Um jedoch nicht 2mal in jedes Model und ViewModel die selben properties schreiben zu müssen (auch nicht gerade pflegeleicht) dachte ich an eine Erbung.

    z.B. erbt das AccountCreateViewModel von dem AccountCreateModel.
    "Zusätzliche" props wie in diesem Beispiel das captcha werden in dem AccountCreateViewModel hinzugefügt und die geerbten props bekommen ebenso ihre Werte.

    Doch nun kann ich der methode "AccountCreate" nur das Model "AccountCreateModel" übergeben und nicht "AccountCreateViewModel".

    Also muss ich irgendwie und irgendwo ein "AccountCreateModel" erstellen und die props von dem gefüllten "AccountCreateViewModel" übertragen.

    Gibt es da eine Möglichkeit dies zu tun und wie du schon sagtest, die props, die es nun im AccountCreateModel NICHT gibt, wegfallen zu lassen und das ganze pflegeleicht?

    Danke

    EDIT:
    Es ist kein muss das so anzugehen. Es kann auch sein, dass meine Idee nicht ganz zündet und eine andere Problemlösung besser wäre. Nur so nebenbei, falls der Ansatz falsch oder zu umständlich ist/wäre.
    Wie sieht es aus mit "Composite Viewmodel" ? Vielleicht ein besserer Ansatz?
    Mittwoch, 18. Juli 2012 15:46
  • Ich persönlich glaube nicht, dass Vererbung hier der richtige Weg ist. Eine derartige "Verknüpfung" zwischen View und Business Logik finde ich wenig hilfreich.

    Zwei Ansätze die hier meines Erachtens besser passen würden:

    1. Copy Constructor (http://msdn.microsoft.com/en-us/library/ms173116(v=vs.80).aspx)

    2. Object to Object Mapper (z.B. https://github.com/AutoMapper/AutoMapper)

    In beiden Szenarien hast du Klassen/Objekte, die mehr oder minder unabhängig voneinander sind.

    Abgesehen von deinem geplanten Vorhaben könntest du ja auch einfach auf die Verwendung zweier Models verzichten und nur ein Einziges nutzen. Die überflüssigen Werte "verfallen" ja mit dem dispose des Objekts, sofern sie nicht irgendwo z.B. in eine DB geschrieben werden. Warum so kompliziert wenn es auch einfach geht ;)

    Gruß Sebastian



    Mittwoch, 18. Juli 2012 16:05