none
Registrar un ModelBinderProvider con Autofac en ASP.NET MVC RRS feed

  • Pregunta

  • Para una aplicación ASP.NET MVC5 he creado un ModelBinderProvider para cierto tipo de datos.

    Si añado el nuevo ModelBinderProvider a la colección BinderProviders en el Global.asax funciona perfectamente.

    ModelBinderProviders.BinderProviders.Add(new CustomModelBinderProvider());

    En la aplicación estoy utilizando Autofac como IoC el cual me permite registrar por ejemplo mis ModelBinders personalizados:

    Autofac.Integration.Mvc.RegistrationExtensions.AsModelBinderForTypes(
            builder.RegisterType<CustomModelBinder>(), typeof(CustomModel));

    Pero no he encontrado la forma de registrar el ModelProvider con Autofac.

    ¿Existe la forma de hacerlo?


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    viernes, 13 de mayo de 2016 7:37

Respuestas

  • builder.Register(c => new CustomModelBinderProvider())
           .As<IModelBinderProvider>()
           

    no lo he probado pero puede ser algo así?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    viernes, 13 de mayo de 2016 13:42
    Moderador

Todas las respuestas

  • Puedes poner tu implementación de tu Custom Model Binder? 

    Has aplicado en dicha clase el atributo Autofac.Integration.Mvc.ModelBinderTypeAttribute ?

    Luego para registrar deberías hacer

    builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
    builder.RegisterModelBinderProvider();

    La fuente de esta respuesta puedes echarle un ojo a http://docs.autofac.org/en/latest/integration/mvc.html


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos



    viernes, 13 de mayo de 2016 9:59
    Moderador
  • El ModelBinder lo tengo definido como:

        public class KeyValuePairModelBinder : IModelBinder
        {
    
    
            public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                var values = bindingContext.ValueProvider as ValueProviderCollection;
                if (values == null)
                {
                    return null;
                }
    
                var key = values.GetValue(bindingContext.ModelName + ".Key");
                var keyValue = Convert.ChangeType(key.AttemptedValue, bindingContext.ModelType.GetGenericArguments()[0]);
                var value = values.GetValue(bindingContext.ModelName + ".Value");
                var valueValue = Convert.ChangeType(value.AttemptedValue, bindingContext.ModelType.GetGenericArguments()[1]);
                return Activator.CreateInstance(bindingContext.ModelType, keyValue, valueValue);
            }
        }

    El problema es que no puede registrarlo directamente porque aplica a una clase genérica (KeyValuePair<TKey, TValue>)

    Por eso he creado un ModelBinderProvider y añadiéndolo a la colección de ModelBinderProviders funciona perfectamente.

    Lo que pasa es que por mantener toda la configuración de binding en el mismo sitio me gustaría registrarlo con Autofac, igual que hago con los ModelBinders. Pero no he encontrado el modo.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    viernes, 13 de mayo de 2016 10:39
  • builder.Register(c => new CustomModelBinderProvider())
           .As<IModelBinderProvider>()
           

    no lo he probado pero puede ser algo así?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    viernes, 13 de mayo de 2016 13:42
    Moderador
  • Efectivamente funciona, aunque con una pequeña modificación, hay que registrarlo como IModelBinderProvider, la clase ModelBinderProvider no existe en System.Web.Mvc

    builder.Register(c => new CustomModelBinderProvider())
           .As<IModelBinderProvider>()


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    viernes, 13 de mayo de 2016 21:57
  • Ya dije que no lo había probado... Jejeje. No te entendía lo,que querías. Me alegro haya funcionado.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 13 de mayo de 2016 22:54
    Moderador