2010-08-12 6 views
6

Zum Beispiel habe ich ein Modell X mit den Eigenschaften Title (String) und Valid (Bool). Ich muss dasselbe Modell auf zwei separaten Seiten mit verschiedenen Feldbeschriftungen und Eingabesteuerelementen anzeigen. Zum Beispiel "Titel" für Titel und "Gültig" für gültig auf einem Formular während "Ziel" für Titel und "Rückgabe" für gültig auf dem anderen.Was ist ASP.NET MVC 2 Möglichkeit, das gleiche Modell auf zwei verschiedene Arten zu repräsentieren

Ich denke, der einfachste Weg wäre, zwei verschiedene Ansichten für das gleiche Modell zu haben. Aber ist es wirklich ein MVC Weg?

Danke

+0

Strike meinen letzten Kommentar zu meiner Antwort, da es offensichtlich schwierig ist, weg von der Single-Modell-Ansatz zu gehen, mal sehen, ob wir eine Lösung sowieso erarbeiten können. Frage: Haben Sie eine Möglichkeit, die beiden Modelle in Bezug auf die darin enthaltenen Daten zu unterscheiden? –

+0

Grundsätzlich ja. Um unser Beispiel trivial zu halten, nehmen wir an, Modell X hat eine weitere Eigenschaft DataType (int) mit möglichen Werten 1 oder 2. – Ramunas

Antwort

3

Nun, nehmen wir an, Sie haben einen View-Ordner namens List und einen namens Details - und das Model in den beiden sollte anders aussehen.

Sie können einen DisplayTemplates-Ordner in jedem der beiden Ordner erstellen und ein PartialControl mit dem gleichen Namen als Ihr Modell erstellen und auch stark in Ihr Modell eingeben.

In Ihren verschiedenen Ansichten können Sie dann <%= Html.DisplayFor(your model) %> tun, oder Sie können auch die regelmäßige <% Html.RenderParital("NameOfPartial", ModelX); %>

bearbeiten verwenden Um zu versuchen, die ursprüngliche Frage zu nähern, vielleicht das Sie in irgendeiner Weise helfen könnte (ich gepostet als eine Antwort auf eine andere Frage How to change [DisplayName“xxx”] in Controller?)

public class MyDisplayName : DisplayNameAttribute 
{ 
    public int DbId { get; set; } 

    public MyDisplayName(int DbId) 
    { 
     this.DbId = DbId; 
    } 


    public override string DisplayName 
    { 
     get 
     { 
      // Do some db-lookup to retrieve the name 
      return "Some string from DBLookup"; 
     } 
    } 
} 

    public class TestModel 
    { 
     [MyDisplayName(2)] 
     public string MyTextField { get; set; } 
    } 

Vielleicht könnten Sie das benutzerdefinierte Attribut umschreiben irgendeine Art von Logik-basierte Namenswahl zu tun, und auf diese Weise die gleiche PartialView für beiden Modelle Variati verwenden ons?

+0

Ja, so habe ich das implementiert. Aber was mich dazu gebracht hat, diese Fragen zu stellen, ist, dass ich die Möglichkeit verliere, Datenanmerkungen zu verwenden und den Charme, den es mir gibt. Ich hatte gehofft, dass jemand eine Art Zwischenklasse für eine meiner Ansichten verwenden würde. Vielleicht ist es komplizierter, aber ein MVC-Weg, um so etwas zu tun? – Ramunas

+0

Und noch etwas über Ordner.Es ist nicht so, als würde man dasselbe Modell in den Listen- und Detailansichten darstellen, es ist eher so, als würde man dasselbe Modell in den Ansichten Controller1/Edit/1 und Controller2/Edit/2 darstellen. Technisch ist es das gleiche Modell, das zwei verschiedene Geschäftseinheiten darstellt (wie Produkt und Weg in meinem trivialen Beispiel) – Ramunas

+0

Um ganz ehrlich zu sein, würde ich das gleiche Modell für zwei völlig verschiedene Entitätsobjekte fallen lassen. Was passiert, wenn Sie sich später dazu entschließen, das Produkt geringfügig von der Route abzuheben? Sie müssten entweder 1. Die Änderungen für beide gleich machen oder 2. Erstellen Sie ein neues Modell und gehen Sie Ihren Code durch, während Sie Route für Produkt oder umgekehrt ändern. Wie Sie sagen, möchten Sie nicht den Charme von Anmerkungen verlieren, und ich stimme dem völlig zu - so sehe ich keinen Vorteil darin, dasselbe Modell für zwei verschiedene Entitäten zu verwenden. –

1

Ist es wirklich das gleiche Modell?

Wenn es sich um zwei verschiedene Entitäten mit ähnlichen Eigenschaften handelt, würde ich zwei separate Ansichtsmodelle erstellen. Jede Gemeinsamkeit könnte in eine abstrakte Basisklasse oder Schnittstelle eingefügt werden.

Wenn es das gleiche Modell aber nur einen anderen Eingabebildschirm ist, dann sicher, das Modell wiederverwenden.

Ich würde mir vorstellen, der erste Fall ist wahrscheinlich derjenige, der hier relevant ist.

+0

Ja, es ist das gleiche Modell aus technischer Sicht. Aber es gibt auch zwei Modelle aus betriebswirtschaftlicher Sicht. Und ja, ich weiß, es klingt wie Mist, aber so ist es. – Ramunas

2

Ja, zwei verschiedene Ansichten sind angebracht, da Sie zwei verschiedene ANSICHTEN Ihres MODELLS bereitstellen.

Sind Sie jedoch sicher, dass Sie Ihre Daten nicht in ein einziges Modell verschneiden, obwohl es in Wirklichkeit jeweils eine andere Entität darstellt?

+0

Siehe meine Kommentare zu Yngve B. Nilsens Antwort, bitte. Ja, Sie haben Recht, ich verwende ein Modell für verschiedene Entitäten, aber es ist der einzige Ausweg, um ein Jahr lang eine Refactoring-Lösung für ein Unternehmen zu entwickeln. – Ramunas

Verwandte Themen