what the purpose net mvc fromquery frombody exclude data asp asp.net-mvc asp.net-mvc-4 asp.net-web-api imodelbinder

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:

  1. System.Web.Mvc.IModelBinder que es el mismo que en versiones anteriores y no ha cambiado
  2. System.Web.Http.ModelBinding.IModelBinder que es utilizado por la API web y el ApiController. Entonces, básicamente, dentro de este método debe establecer actionContext.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)