Wenn ich eine reguläre Ansicht in asp.net mvc rendere, dann sind das die einzigen Eigenschaften des Domain-Objekts, die auf meiner Seite angezeigt werden. Zum Beispiel:
%Vor%Wenn ich jedoch ein Domain-Objekt für json serialisiere, wird es jede Eigenschaft enthalten. Beispiel:
%Vor%Da ich nicht möchte, dass jede Customer-Eigenschaft angezeigt wird, was ist die beste Möglichkeit, die Ausgabeeigenschaften für json in diesem Fall zu filtern? Können Sie eine Einschluss- / Ausschlussliste wie UpdateModel () verwenden? Verwenden Sie eine Proxy-Klasse wie die öffentliche Klasse JsonCustomer? Was würdest du empfehlen?
Ich verwende anonyme Typen dafür:
%Vor%Das ist nicht nur eine gute Idee. Es ist vielmehr ein Schutz gegen die Ausnahme, die Sie beim Aufruf von Json () erhalten, wenn Ihr Objektgraph einen Zirkelverweis enthält.
Bitte verwenden Sie ein Ansichtsmodell. Ein Ansichtsmodell ist ein Objekt, mit dem die Benutzeroberfläche Ihre Domänenobjekte auf dem Bildschirm darstellt. Jeder Bildschirm hat sein eigenes Ansichtsmodell.
Wenn Sie Ihr Ansichtsmodell erstellen, bei dem es sich um ein DTO handelt, bei dem es sich um eine abgeflachte, nullsichere Projektion von Domänenobjekten handelt, ordnen Sie keine Eigenschaften zu, die nicht auf dem Bildschirm angezeigt werden sollen.
Serialisieren Sie das Ansichtsmodell, nicht Ihr Domänenobjekt.
Sie können die Newtonsoft -Bibliothek und das [JsonIgnore] -Attribut zum Markieren von Eigenschaften Ihrer Klasse verwenden, die Sie nicht verwenden Ich möchte nicht entlarven. Es gibt andere Bibliotheken (mit möglichen anderen Eigenschaften ignorieren Attributnamen), ich persönlich bevorzuge dieses, da es sehr flexibel in JSON-Konverter-Erweiterungen usw. + es kann leicht anonyme Objekte serialisieren.
%Vor%Ich stieß auf das gleiche Problem und die eine der Lösungen ist
Verwenden Sie [ScriptIgnore] atribute .. es wird das Problem lösen.
füge system.web.extensions hinzu und füge namespace hinzu:
Verwenden von System.Web.Script.Serialization.
Wenn Sie noch Fragen haben..Lesen Sie weiter..für eine detaillierte Erklärung ..
Ich habe eine Benutzerklasse mit ..
mit System;
mit System.Collections.Generic;
mit System.Linq;
mit System.Web;
mit Iesi.Collections.Generic;
mit System.Runtime.Serialization;
Namespace RAPortal.Core.Entities
{
public class Benutzer
{
%Vor%private IList _Anwendungen;
%Vor%.... Eigenschaften ..
%Vor%Öffentliche virtuelle IList-Gruppen
%Vor%... so weiter ...
und ich habe Gruppen class ..
mit System;
mit System.Collections.Generic;
mit System.Linq;
mit System.Web;
mit System.Web.Script.Serialization;
mit System.Runtime.Serialization;
Namespace RAPortal.Core.Entities
{
Öffentliche Klassengruppe
{
%Vor%}
}
Da der Benutzer in den Gruppen referenziert wird, denkt der JSON, dass es sich um eine zirkuläre Referenz handelt. Es wird eine Ausnahme ausgelöst. Also besteht die Lösung darin, [ScriptIgnore] über dem Benutzer hinzuzufügen. Und fügen Sie der Klasse den Verweis und den Namespace hinzu.
Es hat mein Problem gelöst .. Ich bin mir sicher es gibt bessere Wege da draußen !!! Prost ...
Und denken Sie daran, dass Sie [scriptIgnore] nur in der groups-Klasse und nicht in der Users-Klasse hinzufügen sollten.
Nach meiner Erfahrung berücksichtigt der JavaScriptSerializer einige der XmlSerialization-Attribute, wie zum Beispiel XmlIgnore.
Tags und Links asp.net-mvc json