Ich habe ein benutzerdefiniertes Ansichtsmodell, das mit einem JsonResult serialisiert wurde. Das ViewModel verfügt über einige Eigenschaften, die öffentlich sein müssen, aber gleichzeitig sollten diese Eigenschaften in der resultierenden Json-Ausgabe nicht sichtbar sein.
Ich habe bereits versucht, das [NonSerialized] -Attribut zu verwenden, aber das schien keine Wirkung zu haben.
Gibt es dafür einen einfachen Weg? Oder müsste ich meinen eigenen Ergebnistyp codieren (in diesem Fall werde ich wahrscheinlich nicht stören)?
Sie können ein Attribut [ScriptIgnore]
auf die Member setzen, die nicht serialisiert werden sollen. Siehe ScriptIgnoreAttribute-Klasse in MSDN für ein Beispiel.
Erstellen Sie einfach eine Schnittstelle, die anstelle einer Klasse zurückgegeben wird.
%Vor%Erstellen Sie anschließend eine Klasse, die die Schnittstelle erbt
%Vor%Und geben Sie die Schnittstelle, nicht die Klasse, in der Controller-Aktion
zurück %Vor%Und das resultierende JSON wird
sein %Vor%Eine der Herausforderungen beim clientseitigen Scripting besteht darin, dass Sie beim Ändern Ihrer Klassen keine Ahnung haben, ob Sie die clientseitige Implementierung zerstören oder nicht. Wenn Sie Schnittstellentypen in Ihrem JSON verwenden, verstehen Sie, dass Sie, wenn Sie die Schnittstelle ändern, etwas tun, was möglicherweise die clientseitige Implementierung zunichte macht. Und es erspart Ihnen auch, die Client-Seite vergeblich zu überprüfen, wenn Sie etwas ändern, das NICHT in der Oberfläche ist (also nicht serialisiert wird).
Außerdem haben Ihre ViewModels oft große Sammlungen oder komplexe Typen, die Sie nicht unbedingt auf dem Client ausgeben möchten. Es kann lange dauern, bis Informationen serialisiert oder verfügbar gemacht werden, die nicht in den Client-Code gehören. Die Verwendung von Schnittstellen macht es transparenter zu wissen, was in der Ausgabe ist.
Auch die Verwendung von Attributen wie [ScriptIgnore] für eine Eigenschaft gilt nur für ein bestimmtes Szenario (JavaScript-Serialisierung), sodass Sie genau das gleiche Problem haben müssen, wenn Sie später zum Beispiel nach XML serialisieren. Dies würde unnötigerweise Ihre Viewmodels mit Tonnen von Attributen übersäen. Wie viele von denen willst du wirklich dort? Die Verwendung von Schnittstellen gilt überall und kein Viewmodel muss mit zusätzlichen Attributen übersät sein.
Erweitern Sie die JavaScriptConverter
-Klasse nicht Eigenschaften mit dem NonSerializedAttribute
. Dann können Sie eine benutzerdefinierte ActionResult
erstellen, die Ihre JavaScriptConverter
verwendet, um das Objekt zu serialisieren.
Dies erstellt eine solide und testbare Klasse, ohne Wrapper-Klassen generieren oder anonyme Objekte verwenden zu müssen.
Sie können eine Wrapperklasse erstellen, die nur die gewünschten Eigenschaften in JsonResult verfügbar macht. Im folgenden Beispiel hat Kuh 2 Eigenschaften - "Bein" und "Moo". Angenommen, Sie möchten nur "Leg" als Eigenschaft verfügbar machen. Dann
Dim cw als CowWrapper = Neuer CowWrapper (c)
gibt eine Wrapperklasse zurück, die nur "Leg" verfügbar macht. Dies ist auch nützlich für Dinge wie DataGridView, wenn Sie nur eine Teilmenge der Eigenschaften anzeigen möchten.
Öffentliche Klasse Kuh
Public ReadOnly Property Leg () als String
%Vor%end Eigenschaft
Öffentliche ReadOnly-Eigenschaft Moo () als String
%Vor%end Eigenschaft
Endklasse
Öffentliche Klasse CowWrapper
%Vor%Public ReadOnly Property Leg () als String
%Vor%end Eigenschaft
Ende Klasse
Nicht genau die Antwort, nach der Sie suchen, aber Sie können Json()
mit dem folgenden Code und anonymen Klassen betrügen:
Tags und Links asp.net-mvc json serialization