2012-10-12 50 views
6

tengo un requisito para que los usuarios editar una lista de citas para una ventaja, las cotizaciones pueden ser de diferentes tipos, tales como:Publicación de un conjunto de subclases

  • QuoteForProductTypeA
  • QuoteForProductTypeB

Todos los tipos de presupuesto comparten una clase base común, como QuoteBase.

tengo mis citas se presentan bien en la parte delantera, y parece que después de vuelta los datos correctos también.

Sin embargo, en el servidor obviamente no sabe qué subclase usar, por lo que solo usa la clase base.

creo que es necesario algún tipo de ligante modelo personalizado para WebAPI para comprobar si hay un campo oculto como ModelType que contiene el tipo del objeto de la colección, el aglutinante modelo continuación, crea un nuevo objeto de este tipo y se une al propiedades de mis valores publicados a este objeto.

Sin embargo, estoy atascado en este punto, con muy poca documentación/blogs sobre cómo hacer esto.

He comprobado el código fuente de WebApi para ver si puedo extender una carpeta de modelos predeterminada, pero los valores predeterminados son clases selladas.

Solo puedo implementar IModelBinder por su aspecto, puedo crear el tipo de modelo correcto buscando un valor llamado ModelType, pero no estoy seguro de cómo llenar el resto de los valores en mis subclases, si había una carpeta de modelo predeterminada de la que estaba heredando, solo llamaría al método de vinculación de las clases base.

Respuesta

9

Si su colección de post proviene de solicitud cuerpo, no pasará a través de ligante modelo. Web API usará el formateador para deserializar el contenido.

Si lo que desea es apoyar JSON, es bastante fácil. Sólo tiene que añadir siguiente código a su página de configuración API:

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

El ajuste le permitirá json.net para guardar el nombre del tipo de la carga útil si el tipo de tiempo de ejecución es diferente según el tipo de declaración. Cuando lo publique de nuevo, json.net deserializará la carga al tipo que especificó en la carga útil.

Una muestra de la carga útil se ve así:

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

Gracias, que hace el truco. Estaba serializar mi modelo a JSON para knockoutJs a consumir con este código: Html.Raw (Json.Encode (Modelo)), sin embargo, tenía que cambiar el código para utilizar el serializador Json.Net lugar, y especifique la opción no TypeNameHandling también ... solo en caso de que otros estén buscando la respuesta. –

+1

En caso de que sea útil a alguien más - '$ type' debe ser el primer campo enumerado en el objeto o JSON.Net no será capaz de deserializar ella. –