In der Website, die ich erstelle, muss ich datetime-Eigenschaften haben, die abhängig von der Eigenschaft in verschiedene Kombinationen aufgeteilt werden. Beispiele:
Die Mitgliederansicht enthält eine Eigenschaft für das Geburtsdatum, die in der Ansicht als separate Dropdown-Liste für Tag / Monat / Jahr angezeigt werden muss.
Eine Kreditkartenansicht hat eine Ablaufdatumseigenschaft, die als gesonderte Monats- / Jahresauswahl angezeigt werden muss.
Eine Exkursionsansicht hat nur eine Eigenschaft, die Stunden und Minuten als Textfelder benötigt.
Jedes dieser Szenarien erfordert eine Validierung und idealerweise auch eine Validierung auf der Client-Seite.
Ich habe verschiedene Optionen wie benutzerdefinierte Bindung, benutzerdefinierte Attribute angeschaut und betrachte nun benutzerdefinierte Editor-Vorlagen, aber bisher hatte ich wenig Glück bei der Suche nach geeigneten Lösungen.
Es scheint eine gewöhnliche Aufgabe zu sein, aber die Suche im Netz hat wenig gezeigt, was alles abdeckt (besonders mit dem Validierungselement).
Also meine Frage ist, hat es jemand anderes geschafft, das oben genannte zu erreichen?
(Daumen drücken!)
Ok, ich werde versuchen, dich 90% des Weges dorthin zu bringen. Dies ist eigentlich ein großer und komplexer Teil von MVC 2 und in dieser Antwortbox fast unmöglich zu beantworten.
Nun sollten Sie zuerst zum Blog von Brad Wilsons gehen und ausführlich lesen, wie Sie die MVC 2-Standardvorlagen anpassen können. Das sollte Ihnen ein viel klareres Verständnis aller beweglichen Teile geben.
Ich fange jetzt ein einfaches Beispiel an, wie man ein künstliches Terminansichtsmodell erstellt, in dem wir sicherstellen wollen, dass die gelieferten Werte nicht rechtzeitig zurückgehen. Achte jetzt nicht auf die Attribute, wir kommen dorthin.
Hier ist das ViewModel, das ich verwende:
%Vor%Und ich habe das zum Standard HomeController hinzugefügt (nichts Schickes):
%Vor%Und hier ist meine Ansicht:
%Vor%Schritt 1: Festlegen der Bühne
Das erste, was Sie tun möchten, ist die "Standard-Vorlagen" aus dem Blog-Eintrag zu greifen. Die wichtigste in diesem Fall ist die, die in /Views / Shared / EditorTemplates / Object.asxc sitzt. Object.ascx ist der Schlüssel für die gesamte Operation. Alle Html.Editor ***** Methoden werden dies irgendwann aufrufen.
Nun müssen wir die erste Standardfunktionalität ändern, die diese Zeile innerhalb von Object.ascx enthält
%Vor%Was heißt "zeige keine verschachtelten komplexen Typen an" und das wollen wir nicht. Ändere das & gt; 1 bis a & gt; 2. Jetzt werden Modelle in Ihrem Objektdiagramm angezeigt, für die Vorlagen erstellt werden, anstatt nur Platzhaltertext zu erstellen.
Behalte einfach alles andere für jetzt vor.
* Schritt 2: Überschreibungsvorlagen **
Wenn Sie die Blogeinträge lesen, werden Sie hoffentlich verstehen, wie die Methoden Editor *** und Display die Vorlagen in View / Shared / EditorTemplates und DisplayTemplates automatisch aufrufen. Betrachten Sie sie als Aufruf von Html.RenderPartial ("TYPENAME", MyType) sie sind nicht aber es ist nah genug im Konzept.
Wenn Sie also die Lösung so weit ausführen und zur richtigen URL gehen, werden Sie feststellen, dass MVC 2 Object.ascx zweimal aufruft, einmal für Ihr AppointmentViewModel und einmal für die Eigenschaft DateRange. Out of the Box rendert nur die gleiche Sammlung von Formularfeldern.
Nehmen wir an, wir möchten, dass unsere Vorlage unseren DateRange-Editor mit einer rot umrandeten Box umgibt. Was wir tun möchten, ist MVC 2, um eine benutzerdefinierte DateTime.ascx Vorlage anstelle von Object.ascx aufzurufen und das ist so einfach wie das Hinzufügen unserer eigenen Vorlage in View / Shared / EditorTemplates / DateRange.ascx. In diesem Fall habe ich einfach genommen, was von Object.ascx mit unserem DateRange-Modell generiert wurde, und den Code einfach in ein neues DateRange.ascx eingefügt:
%Vor%Wala!
Wenn Sie nun die Lösung ausführen, sollten Sie ein rotes Kästchen um unseren DateRange sehen. Der Rest der Anpassungen liegt bei Ihnen! Sie könnten jQuery-Datepicker-Boxen hinzufügen. In Ihrem Fall könnten Sie beide Felder in ein einzelnes Div setzen, so dass sie horizontal ausgerichtet sind. Der Himmel ist an dieser Stelle die Grenze.
Schritt 3: Validierung:
Die Validierung funktioniert so, wie Sie es erwarten. Ein [Erforderlich] -Attribut in Ihrem Der DateRange-Typ funktioniert genauso wie jedes andere Validierungsattribut.
Jetzt sehen Sie, dass ich ein Zeitattribut, das ich in die DateRange-Eigenschaft von AppointmentViewModel gesetzt habe, nicht rückwärts laufen lassen kann. Alles, was Sie tun müssen, um diese typspezifischen Validierungsattribute zu erstellen, ist, das Basis ValidationAttribute zu erben und zu implementieren:
%Vor%Wenn Sie nun das hinzufügen und Ihre Eigenschaft dekorieren, sollten Sie die Fehlermeldung sehen, die im benutzerdefinierten Validierungsattribut CantGoBackwardsInTime bereitgestellt wird.
Ich werde mehr davon aktualisieren und aufklären, wenn Sie irgendwelche Probleme haben, aber das sollte Sie auf Ihrem Weg voranbringen. (Ich dachte mir, ich könnte das vor dem Schlafengehen austesten) Nur eine Warnung: Der neue Editor für Teile von MVC 2 ist das Beste, was es auf der Welt gibt und hat ein riesiges Potential, MVC 2 Super RAD Fähigkeiten zu verleihen; Doch neben Brad Wilsons Blog gibt es kaum Informationen. Bleiben Sie einfach dabei und haben Sie keine Angst, den MVC 2-Quellcode zu sehen, wenn Sie es auch brauchen.
Versuchen Sie das alles auf einer Seite zu tun? Oder eine Methode? Ich bin mir nicht sicher, wie du das machen willst. Hier ist mein Bild, wenn ich dich richtig verstanden habe.
Zum Beispiel könntest du so etwas für das Geburtsdatum tun.
Aus Ihrer Sicht
%Vor%Irgendwo in deinem Controller hast du so etwas. Vielleicht könntest du alles zu einer Schleife oder so kombinieren.
%Vor%Also, was ich verstehe, ist, dass Sie einige Sachen auf dem Server machen können, um die gewünschten Daten zu bekommen, und fügen Sie sie einfach über ViewData in die Dropdown-Listen ein.
Tags und Links asp.net-mvc asp.net-mvc-2