2012-10-12 16 views
6

Mam wymaganie użytkownikom edytować listę cytatów na smyczy, cytaty mogą być różnych typów, takich jak:zamieszczaniu zbiór podklas

  • QuoteForProductTypeA
  • QuoteForProductTypeB

Wszystkie typy cytowań mają wspólną klasę podstawową, na przykład QuoteBase.

Moje cytaty wyświetlają się dobrze na przednim końcu i wydają się również odsyłać prawidłowe dane.

Jednak na serwerze nie wiadomo, która podklasa ma być używana, więc po prostu używa klasy bazowej.

Myślę, że potrzebuję jakiegoś niestandardowego segregatora dla programu WebApi w celu sprawdzenia ukrytego pola, takiego jak ModelType, które zawiera typ obiektu w zbiorze, modelowy segregator następnie tworzy nowy obiekt tego typu i wiąże go właściwości z moich zaksięgowanych wartości do tego obiektu.

Jednak utknąłem w tym momencie z bardzo małą dokumentacją/blogami, jak to zrobić.

Sprawdziłem kod źródłowy WebApi, aby sprawdzić, czy mogę rozszerzyć domyślny segregator modelu, ale wszelkie wartości domyślne są klasami zamkniętymi.

Mogę tylko zaimplementować IModelBinder na podstawie jego wyglądu, mogę utworzyć poprawny typ modelu, szukając wartości o nazwie ModelType, ale wtedy nie jestem pewien, jak wypełnić pozostałe wartości w moich podklasach, jeśli istniał domyślny spinacz modelu, który dziedziczyłem po wywołaniu metody wiązania klas bazowych.

Odpowiedz

9

Jeśli Twoja kolekcja post pochodzi z treści żądania, nie przejdzie ona przez segregator. Web API użyje formatera do deserializacji treści.

Jeśli chcesz tylko wspierać json, to całkiem proste. Wystarczy dodać następujący kod do Web API config:

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto; 

ustawienie pozwoli json.net zapisać nazwę typu w polu danych, jeśli typ jest inny czas pracy z rodzajem deklaracji. Po jego opublikowaniu, json.net będzie deserializować ładunek do typu określonego w ładunku.

Próbkę ładowność wygląda następująco:

{"$type":"MvcApplication2.Models.Car, MvcApplication2","SeatCount":10,"WheelCount":4,"Model":0,"Brand":null}] 
+0

Dziękuję, że zrobić podstęp. Serializowałem mój model do json'a dla knockoutJs do konsumpcji z tym kodem: Html.Raw (Json.Encode (Model)), jednak musiałem zamienić ten kod, by zamiast niego użyć serializatora Json.Net i określić tam opcję TypeNameHandling zbyt ... na wypadek, gdyby inni szukali odpowiedzi. –

+1

Jeśli jest to przydatne dla kogokolwiek innego - '$ type' musi być pierwszym polem wymienionym w obiekcie lub JSON.Net nie będzie w stanie go przekształcić. –