2017-03-16 4 views
0
public abstract class AbstractSearch 
{ 
    public string Property { get; set; } 
    public string TargetTypeName { get; set; } 
} 

public class DateSearch : AbstractSearch 
{ 
    public DateTime? SearchTerm { get; set; } 
    public DateComparators Comparator { get; set; } 
} 

public enum DateComparators 
{ 
    Less, 
    LessOrEqual, 
    Equal, 
    GreaterOrEqual, 
    Greater, 
    InRange 
} 

public class SearchViewModel 
{ 
    public IEnumerable<AbstractSearch> SearchCriteria { get; set; } 
} 

So übergeben Sie die Eigenschaften von SearchViewModel von Clientseite JSON.Wie JSON-Daten zur abstrakten Klasse übergeben werden?

Ich muss Property, TargetTypeName, SearchTerm, Comparator von Javascript zu Webapi durch Json übergeben.

Ich verwende Web API 2.0 als Serverside. Ist es möglich, den Json-Parameter in die Inherited-Klasse zu übergeben?

+4

Mögliche Duplikat [Deserialisieren JSON abstrakte Klasse] (http://stackoverflow.com/questions/20995865/deserializing-json-to-abstract-class) – aloisdg

+0

warum nicht '' 'public IEnumerable SearchCriteria {get; einstellen; } '' '? – tym32167

+0

ist es möglich, ohne SearchViewModel-Klasse? – Pradees

Antwort

1

Wenn Sie den konkreten Typ beim Serialisieren auf der Client-Seite angeben, können Sie dies mit TypeNameHandling erledigen. Sie geben den Typ mit einer $type-Eigenschaft in JSON an.

Der Modellbinder kann eine Abstract-Klasse nicht instanziieren.

konfigurieren JSON.NET:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; 

dann Ihre JSON in diesem Format schreiben:

{ 
    "$type": "Namespace.DateSearch, AssemblyName" 
    "Property": "..." 
    "etc": "" 
} 
+0

könnten Sie bitte einen Beispielcode mit dem obigen Beispiel geben? – Pradees

+0

@Pradees-Beispielcode verfügbar unter angegebenen Link – tym32167

Verwandte Themen