Verwenden des bearbeitbaren Attributs im MVC 3-Ansichtsmodell

8

Ich möchte Attribute verwenden, um Ansichtsmodelleigenschaften schreibgeschützt zu markieren, damit die Ansichtsfelder nur in der gerenderten Ansicht gelesen werden. Das Anwenden von System.ComponentModel.DataAnnotations.EditableAttribute scheint genau das Attribut zu sein, das ich brauche, aber es scheint nicht zu funktionieren, d. H. Textfeldfelder sind immer noch editierbar. Ich habe mich überall umgeschaut und kann keine Antworten und nur einige verwandte Fragen finden. Das bearbeitbare Attribut, wie unten angewendet, funktioniert nicht, wenn die Ansicht gerendert wird.

%Vor%

Ich kann das Readonly-Verhalten mit einer View-Hilfsfunktion wie dieser erreichen, aber ich bevorzuge die Verwendung eines Attributs für die Modelleigenschaft.

%Vor%

Andere Attribute funktionieren einwandfrei, einschließlich benutzerdefinierter Validierungsattribute. Können Sie mir sagen, ob das Attribut editierbare Datenanmerkungen in diesem Kontext funktioniert, ob es nur so funktioniert, wie es oben angewendet wurde, oder gibt es noch etwas anderes zu tun? Danke.

    
Steven Chalk 13.04.2012, 15:02
quelle

5 Antworten

4

Die EditableAttribute-Dokumentation lautet:

  

Das Vorhandensein des EditableAttribute-Attributs in einem Datenfeld zeigt an, ob der Benutzer den Wert des Feldes ändern kann.

     

Diese Klasse erzwingt weder, noch garantiert sie, dass ein Feld bearbeitbar ist. Der zugrunde liegende Datenspeicher kann möglicherweise zulassen, dass das Feld unabhängig vom Vorhandensein dieses Attributs geändert wird.

Dies bedeutet leider, dass die Verwendung dieses Attributs keine Auswirkung auf die Validierung in MVC hat. Das fühlt sich falsch an, aber es macht Sinn, wenn Sie darüber nachdenken, was es im MVC-Framework zu implementieren gilt. Zum Beispiel führt der Benutzer in einer typischen "Edit" -Ansicht eine anfängliche GET-Anfrage durch, bei der das Modell (normalerweise aus einem DB-Datensatz) gefüllt und der Ansicht gegeben wird, die für den Benutzer gerendert werden soll. Dann nimmt der Benutzer einige Änderungen vor und reicht das Formular ein. Durch das Senden des Formulars wird eine neue Instanz des Modells aus den POST-Parametern erstellt. Es wäre sehr schwierig für die Validierer sicherzustellen, dass das Feld in beiden Objektinstanzen denselben Wert hat, weil eine der Instanzen (die erste von der GET-Anfrage) bereits entsorgt wurde.

Nun, wenn das Attribut keine Funktionalität hat, warum sollte man es überhaupt benutzen?

Meine beste Vermutung ist, dass Entwickler erwarten, dass sie es in ihrem Code verwenden, um ihre Absicht zu zeigen. Praktischerweise können Sie auch Ihren eigenen benutzerdefinierten Code schreiben, um nach dem Vorhandensein dieses Attributs zu suchen ...

%Vor%

Bedenken Sie auch, dass diese DataAnnotation-Attribute nicht nur für MVC-Anwendungen geeignet sind, sondern für viele verschiedene Arten von Anwendungen. Obwohl MVC mit diesem Attribut nichts Besonderes macht, haben andere Frameworks die Funktionalität / Validierung für dieses Attribut implementiert .

    
Jesse Webb 28.11.2012 18:05
quelle
2

Habe dieses Problem nur halb selbst gelöst.

[HiddenInput (DisplayValue = true)]

Das Feld wird angezeigt, kann aber nicht bearbeitet werden.

    
panzerblitzer 07.07.2012 03:00
quelle
1

Haben Sie ein anderes Szenario? Gibt es einen besonderen Grund, warum Sie einen Anfangswert zulassen? Ich frage, weil die Dokumentation sagt :

  

Da beide Eigenschaften normalerweise denselben Wert enthalten sollen,   Die AllowInitialValue-Eigenschaft wird auf den Wert von AllowEdit in dem festgelegt   Klassenkonstruktor.

Ich denke, wenn Sie es auf false setzen und nicht explizit das AllowInitialValue deklarieren, wird es funktionieren.

    
Terry 13.04.2012 15:08
quelle
1

Es wurde festgestellt, dass die Verwendung von Editable statt Readonly auf dem Modell genau gleich funktioniert.

%Vor%

Diese Syntax funktioniert, wenn Sie ein Eigenschaftsattribut in der Ansicht selbst abfragen. Funktioniert auch, wenn das Attribut Editable (true) ist

%Vor%

Verwenden Sie hier eine Editor-Vorlage, eine einfache String-Vorlage:

%Vor%     
Steven Chalk 29.11.2012 20:11
quelle
0

Ich weiß nicht, ob Sie das schon herausgefunden haben, aber wir benutzen

%Vor%

Verwendung

%Vor%     
Steven 06.11.2012 21:49
quelle

Tags und Links