Erstellen einer dynamischen JSON-Antwort in MVC 5 - Wie man Eigenschaften an eine Ergebnismenge anhängt?

7

Ich gebe ein Array von Objekten an eine Seite zurück, die eine Diashow basierend auf einem Fotoalbum rendert.

Ich hole meine Bilder aus der Datenbank.

Bevor ich dieses Array als Ergebnis zurückgebe, möchte ich eine "Thumbnail" -URL-Eigenschaft anheften. Diese Eigenschaft existiert nicht auf dem AlbumPicture, aber ich möchte es in der Antwort.

Dies veranschaulicht die Idee:

%Vor%

Was ist der eleganteste Weg, dieses JSON-Feld zu meiner Ergebnismenge hinzuzufügen?

Diese Frage ist so grundlegend, dass es wahrscheinlich ein Duplikat ist. Allerdings googelte ich 10 Minuten lang und konnte nur Janky-Lösungen finden, die von Bibliotheken von Drittanbietern abhängen. Ich bin an der aktuellen "Best Practice" interessiert.

Mögliches Duplikat von: How um der JSON-Antwort vom Controller dynamisch mehr Eigenschaften hinzuzufügen . Diese Antwort macht jedoch die dynamisch hinzugefügten Felder zu den AlbumPicture-Eigenschaften im resultierenden JSON zu Onklingen anstelle von Geschwistern.

    
John Shedletsky 15.01.2015, 01:00
quelle

9 Antworten

5

Ich stimme den meisten obigen Antworten zu, indem ich ein dynamisches Objekt oder ein expando-Objekt benutze, die zusätzliche Eigenschaft usw. hinzufügen können. Die Aufgabe ist jedoch einfach und meiner Meinung nach sollten Sie Ihr Entitätsobjekt niemals Benutzern oder Benutzern zugänglich machen. Ich würde einfach ein einfaches ViewModel erstellen und es wie folgt an den Aufrufer übergeben:

%Vor%     
qamar 19.01.2015, 08:39
quelle
8

Derzeit unterstützt C # 4.0 dynamische Objekte, sodass Sie dynamische Objekte zum Hinzufügen Ihrer Eigenschaften als Laufzeit verwenden können.

Fügen Sie zuerst diese Erweiterungsmethode Ihrem Code hinzu:

%Vor%

Und dann ändern Sie Ihren Code in etwas wie das

%Vor%     
Huy Hoang Pham 15.01.2015 07:56
quelle
2

Die Antwort conanak99 ist meiner Meinung nach der richtige Weg, dies zu tun. Erweiterungen wie diese sind in der Regel in Ihren Kern-Utilities versteckt und daher die wiederverwendbare Natur seiner Antwort. Wenn Sie sicher sind, dass Sie es nur für diesen Zweck verwenden, können Sie es zu

umgestalten %Vor%

, die wiederum den folgenden Code ergeben, um das zu tun, was Sie wollen:

%Vor%

Aktualisierung ------------------------------

Wenn Sie Autoadapter verwenden oder es installieren möchten, ist dies eine weitere Problemumgehung, die verwendet werden kann, um das gleiche Ergebnis zu erzielen.

Zunächst erstellen Sie eine Erweiterungsklasse des Albums mit der hinzugefügten Eigenschaft

%Vor%

Dann erstellen Sie eine neue Instanz der erweiterten Klasse in der SELECT-Anweisung, kopieren die Eigenschaftswerte mit AutoMapper (oder manuell, wenn Sie nicht zu viele haben) in die neue Klasse und legen die Miniatur-Eigenschaft fest. p> %Vor%

Automapper kopiert im Grunde nur Eigenschaftswerte von einer Klasse in eine andere, wobei Standardkonventionen verwendet werden, die bei Bedarf überschrieben werden können.

    
Andrej Kikelj 19.01.2015 08:27
quelle
2

Trennen Sie die dynamischen Eigenschaften von den Domänen durch Verwendung einer Projektion und eines anonymen Objekts.

%Vor%     
Travis J 20.01.2015 21:09
quelle
2

Sie können Json.NET verwenden, um sie in ihre Objekte zu konvertieren und die Eigenschaften für das erstellte JObject dynamisch hinzuzufügen.

Von dort können Sie die JSON-Zeichenfolge als Inhalt von der Aktion zurückgeben.

%Vor%     
Brian 22.01.2015 23:20
quelle
0

Sie können den anonymen Typ verwenden, um einen neuen Typ mit den Eigenschaften AlbumPicture und Thumbnail zu erstellen.

Hier ist der modifizierte Code.

%Vor%

Und Sie werden json Ergebnis so etwas bekommen

%Vor%

Ich hoffe, es hilft dir.

    
sandip patil 22.01.2015 10:23
quelle
0

Nicht direkt eine Antwort auf Ihre Frage, aber es scheint mir, dass Sie etwas wie das Entity Framework verwenden, um Ihre Datenbankverbindung mit einer "Datenbank zuerst" -Ansatz zu behandeln. Jetzt möchten Sie nicht die Eigenschaft "Thumbnail" in der Datenbank hinzufügen, sondern auch die dynamisch erstellten Modelle nicht ändern.

Ich denke, der beste Ansatz wäre, die Eigenschaft dem Modell und nicht nur dem JSON hinzuzufügen. In meiner Meinung wird es viel einfacher zu bedienen und ermöglicht es auch, das Thumbnail direkt in einer Ansicht zu verwenden, wenn Sie es jemals brauchen.

Ich würde dem Datenbankprojekt ExtendedModels.cs eine Klasse hinzufügen und etwas wie das folgende hinzufügen:

%Vor%

Offensichtlich wird es auch der JSON-Ausgabe hinzugefügt.

AKTUALISIEREN

Wenn Sie zuerst Code verwenden, können Sie mit der NotMapped Annotation sicherstellen, dass eine Eigenschaft nicht in der Datenbank erstellt wird. Weitere Informationen zu verschiedenen Versionen finden Sie unter Ignorieren einer Klasseneigenschaft in Entity Framework . In deinem Fall wäre es so etwas wie das Folgende. Sie können das Get / Set auf das ändern, was Sie wollen.

%Vor%     
Hugo Delsing 20.01.2015 08:46
quelle
0

Ich würde empfehlen, basierend auf Ihrem AlbumPicture-Objekt ein Datenübertragungsobjekt zu erstellen.

%Vor%

// Controller-Code

%Vor%

Sie können dem Dto-Objekt beliebig viele Eigenschaften hinzufügen und diese Methode verwenden, um diese Eigenschaften an den Client zurückzugeben.

    
Kevin Kirtley 24.01.2015 20:30
quelle
0

Es ist nicht so, dass .NET bei JSON schlecht ist, es ist nur eine stark typisierte Sprache, was bedeutet, dass Sie es nicht mit einer dynamischen Sprache wie Javascript vergleichen können, wenn Sie mit dynamischen Operationen auf Typen umgehen.

Meiner Meinung nach ist der beste Weg, um das gewünschte Ergebnis zu erzielen, das Erstellen neuer Klassen für die Client-Seite. Es ist im Allgemeinen eine schlechte Idee, Ihre Domänenmodelle direkt für die Kommunikation mit dem Client zu verwenden. Im besten Fall können Sie ViewModels einfach erstellen, indem Sie Ihre Domänenmodelle erben, wenn Sie weniger Code kopieren möchten. Aber wie gesagt, Sie möchten wahrscheinlich nicht alle Eigenschaften Ihres Modells Ihren Kunden zugänglich machen.

Wenn eine vollständige Modellausstellung beabsichtigt ist, dann könntest du @conanak99 in seiner ausgezeichneten Antwort darauf hinweisen. Der Code könnte viel eleganter sein, indem er sein LINQ-Formular verwendet:

%Vor%     
slvnperron 25.01.2015 20:25
quelle

Tags und Links