2010-02-13 7 views
8

Ich erstelle eine asp.net mvc 2 Anwendung, die mein Ansichtsmodell dynamisch abhängig von Benutzereingabe erzeugt. Einfach gesagt, der Benutzer kann auswählen, welche Felder er in seiner Ansicht sehen möchte.ASP.NET MVC 2 Datenanmerkungen in einem dynamisch erzeugten Modell

Da die Vorlagenhelfer stark von Modelleigenschaften und -attributen (Datenanmerkungen) abhängen, müsste ich die Attribute während der Laufzeit irgendwie zum Ansichtsmodell hinzufügen. Es muss nicht gesagt werden, dass dies keine einfache Aufgabe ist.

Also, was empfehlen Sie mir, in diesem Szenario zu tun? Ich bin nicht in der Lage, die Attribute statisch hinzuzufügen, also sollte ich fortfahren und versuchen, sie dynamisch hinzuzufügen, selbst wenn es viel Arbeit ist oder sollte ich versuchen, einen anderen Ansatz zu verwenden?

Vielen Dank im Voraus!

Felipe

Antwort

3

Ein benutzerdefiniertes Modell Binder würde Ihnen nur im Bindungsteil helfen. Es hilft nicht mit den Vorlagen-Helfern oder anderen Features von ASP.NET MVC.

Ich empfehle das Schreiben eines benutzerdefinierten Metadaten Anbieter anstelle von von ModelMetadataProvider vererben und Ihrem Provider in global.asax Registrierung von ModelMetadataProviders verwenden. Ein benutzerdefinierter Metadatenanbieter kann seine Metadaten von einer beliebigen Stelle abrufen: CLR-Attribute, XML-Datei, Datenbank oder Zufallszahlengenerator. Der integrierte Datenannotationsanbieter verwendet natürlich CLR-Attribute.

Sie können sich den Quellcode für den integrierten Data Annotations-Metadatenanbieter ansehen, um ein Beispiel für die Implementierung eines Providers zu erhalten. Sie können den ASP.NET MVC 2 RC 2-Quellcode von the CodePlex site herunterladen. Es könnte auch eine Implementierung im MVC-Futures-Projekt geben, aber ich bin mir nicht sicher.

+0

Dank viel Mann! –

0

Klingt wie viel des Guten (wenn ich das richtig verstehe) -, dass die Modelle im laufenden Betrieb erstellt. Sie nutzen nicht den Hauptvorteil von Modellen; Kompilieren Sie Zeitüberprüfungen.

Ich würde versuchen, spezifische Objekte für die Aufgabe (zum Beispiel eine UserForm-Klasse, die Liste von UserFormFields-Klassen usw. haben würde) in der Hand zu verwenden und sie nicht im laufenden Betrieb zu erstellen.

Edit: Was ich vorschlage, ist zu nicht Verwendung Attribut basierte Validierung und gestalten Sie Ihr Modell mit Validierung im Auge behalten. Ein Design wie unten könnte meinen Standpunkt besser erklären:

interface IUserValidation 
{ 
    bool IsValid(); 
} 

class RequiredUserValidation : IUserValidation 
{ 
    public bool IsValid() 
    { 
     // .... 
    } 
} 

class UserFormField 
{ 
    List<IUserValidation> _validations; 

    public IEnumerable<ValidationResult> Validate() 
    { 
     // ... 
    } 
} 
+0

Das ist fast wie mein Modell aussieht. Eine Sammlung von Feldern mit Daten. Das Problem ist, dass ich zur Kompilierzeit keine Informationen über diese Felder habe. Ich muss die Datenbank abfragen und Informationen von den Feldern erhalten und sie bevölkern ihre Attribute –

0

Scheint, wie Sie eine benutzerdefinierte Ansicht Modell Binder benötigen würde, die dynamisch Validierung gilt.

Verwandte Themen