asp.net-mvc - the - web api frombody parameters
¿Cómo creo un archivador de modelo personalizado utilizando la firma `BindModel(HttpActionContext actionContext...`? (4)
Hay 2 interfaces IModelBinder:
-
System.Web.Mvc.IModelBinder
que es el mismo que en versiones anteriores y no ha cambiado -
System.Web.Http.ModelBinding.IModelBinder
que es utilizado por la API web y el ApiController. Entonces, básicamente, dentro de este método debe estableceractionContext.ActionArguments
en los valores correspondientes. Ya no devuelve una instancia modelo.
Necesito saber cómo crear un IModelBinder
personalizado en MVC 4 y se ha cambiado.
El nuevo método que debe implementarse es:
bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext);
Una actualización posterior a RC a la publicación de Todd:
Agregar su proveedor de carpetas modelo se ha simplificado:
var configuration = GlobalConfiguration.Configuration;
configuration.Services.Add(typeof(ModelBinderProvider), new YourModelBinderProvider());
Una forma incluso más sencilla de agregar un encuadernador sin un ModelBinderProvider es este:
GlobalConfiguration.Configuration.BindParameter(typeof(User), new CustomModelBinder());
Este enlace , proporcionado por Steve, proporciona una respuesta completa. Lo estoy agregando aquí para referencia. El crédito va a dravva en los foros de asp.net.
Primero, crea una clase derivada de IModelBinder
. Como dice Darin, asegúrese de usar el espacio de nombres System.Web.Http.ModelBinding
y no el conocido MVC equivalente.
public class CustomModelBinder : IModelBinder
{
public CustomModelBinder()
{
//Console.WriteLine("In CustomModelBinder ctr");
}
public bool BindModel(
HttpActionContext actionContext,
ModelBindingContext bindingContext)
{
//Console.WriteLine("In BindModel");
bindingContext.Model = new User() { Id = 2, Name = "foo" };
return true;
}
}
A continuación, proporcione un proveedor, que actúa como fábrica para su nueva carpeta, y cualquier otra carpeta que pueda agregar en el futuro.
public class CustomModelBinderProvider : ModelBinderProvider
{
CustomModelBinder cmb = new CustomModelBinder();
public CustomModelBinderProvider()
{
//Console.WriteLine("In CustomModelBinderProvider ctr");
}
public override IModelBinder GetBinder(
HttpActionContext actionContext,
ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(User))
{
return cmb;
}
return null;
}
}
Finalmente, incluya lo siguiente en su Global.asax.cs (por ejemplo, Application_Start).
var configuration = GlobalConfiguration.Configuration;
IEnumerable<object> modelBinderProviderServices = configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider));
List<Object> services = new List<object>(modelBinderProviderServices);
services.Add(new CustomModelBinderProvider());
configuration.ServiceResolver.SetServices(typeof(ModelBinderProvider), services.ToArray());
Ahora, puedes simplemente demorar el nuevo tipo como un parámetro para tus métodos de acción.
public HttpResponseMessage<Contact> Get([ModelBinder(typeof(CustomModelBinderProvider))] User user)
o incluso
public HttpResponseMessage<Contact> Get(User user)