with tutorial started route net name asp and asp.net-web-api model-binding

asp.net web api - tutorial - Web API ModelBinders: cómo vincular una propiedad de su objeto de forma diferente



web api rest c# (1)

En Web API, debe distinguir tres conceptos: ModelBinding , Formatters y ParameterBinding . Eso es bastante confuso para las personas que se trasladan de / usan a MVC, donde solo hablamos de ModelBinding .

ModelBinding , al contrario que MVC, es responsable solo de extraer datos del URI. Los formateadores se ocupan de leer el cuerpo, y ParameterBinding ( HttpParameterBinding ) abarca ambos conceptos anteriores.

ParameterBinding realmente solo es útil cuando se quiere revolucionar todo el mecanismo (es decir, permitir que dos objetos se vinculen desde el cuerpo, implementar un enlace estilo MVC, etc.) - para tareas más simples modificando carpetas (para datos específicos de URI) o formateadores (para cuerpo datos) es casi siempre más que suficiente.

De todos modos, al punto: lo que desea lograr se puede hacer fácilmente con un convertidor JSON.NET personalizado (JSON.NET es la biblioteca de serialización predeterminada detrás del motor de formato JSON de la API web).

Todo lo que necesitas hacer es:

public class Param { public int Id { get; set; } public string Name { get; set; } [JsonConverter(typeof(CustomArrayConverter))] public string Choices { get; set; } }

Y luego agrega el convertidor:

internal class CustomArrayConverter : JsonConverter { public override bool CanConvert(Type objectType) { return true; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var array = JArray.Load(reader); return JsonConvert.SerializeObject(array); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { serializer.Serialize(writer, JArray.Parse(value as string)); } }

En este caso, le estamos diciendo a JSON.NET en el convertidor que almacene Choices como string (en el método de lectura), y cuando devuelva el objeto Param con la propiedad Choices al cliente (en el método de escritura) tomamos la string y serializamos a una array para que la salida JSON se vea idéntica a la entrada.

Puedes probarlo ahora así:

public Param PostParam(Param param) { return param; }

Y verifique que los datos que ingresan son como usted desea y que los datos que salen son idénticos a los de JSON original.

Tengo la siguiente firma de acción

[ValidateInput(false)] public HttpResponseMessage PostParam(Param param)

Con Param mirando algo como esto:

public class Param { public int Id { get; set;} public string Name { get; set; } public string Choices { get; set; } }

Aquí está el problema - lo que viene por el cable es algo como esto

{ Id: 2, Name: "blah", Choices: [ { foo: "bar" }, { blah: "blo" something: 123 } ] }

No quiero que "Choices" se deserialice, quiero que se almacene como una cadena (sí, entiendo las implicaciones de seguridad). Comprensiblemente, me sale un error porque el encuadernador predeterminado no lo sabe.

Ahora, con Asp Mvc, la creación de un ModelBinder específico sería bastante simple. Carné de identidad

  • heredar DefaultModelBinder
  • anular la deserialización de la propiedad con la mía
  • establecer la carpeta en mi Application_Start usando Binders.Add

Parece que con Web Api este es un proceso diferente: System.Web.DefaultModelBinder no tiene nada que sobrescribir y que no puedo conectar cosas usando Binders.Add . He intentado buscar pero no he podido encontrar mucho sobre cómo hacer lo que quiero. Esto es más complicado ya que aparentemente la aplicación de ModelBinders cambió bastante respecto a Beta y RTM, por lo que hay mucha información desactualizada.