Pregunta

Tengo una interfaz que tiene una propiedad que es una lista de una interfaz y una clase que implementa la interfaz, me he registrado para Autofac, pero mi problema es Autofac no enlazar datos a mi clase, yo escribí mi código de abajo :

Mi Interfaces :

public interface IDetail
{
    int Id { get; set; }

    string Name { get; set; }
}

public interface IMaster
{
    int Id { get; set; }

    DateTime Description { get; set; }

    List<IDetail> Details { get; set; }
}

Mis Clases :

public class Detail : IDetail
{
    public int Id { get; set; }

    public string Name { get; set; }
}

public class Master : IMaster
{
    public int Id { get; set; }

    public DateTime Description { get; set; }

    public List<IDetail> Details { get; set; }
}

Mi Controlador :

public class HomeController : Controller
    {
        IMaster _t;

        [HttpPost]
        public ActionResult Create(IMaster t)
        {
            _t = t;
        }


    }

Mi Autofac Registeration :

    public class DependencyConfigure
        {
//Initializing
            public static void Initialize()
            {
                RegisterServices();
            }

//Registering
            private static void RegisterServices()
            {

                ContainerBuilder builder = new ContainerBuilder();

                builder.RegisterAssemblyTypes(
                    typeof(MvcApplication).Assembly
                    ).PropertiesAutowired();            

                builder.RegisterType<ExtensibleActionInvoker>()
                .As<IActionInvoker>()
                .WithParameter("injectActionMethodParameters", true);
                        builder.RegisterControllers(Assembly.GetExecutingAssembly())
                            .InjectActionInvoker();

                builder.RegisterType(typeof(Master)).As(typeof(IMaster));

                var container = builder.Build();
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));            
            }

        }

y a la vista está aquí :

@model WebApplication1.Models.Master

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

        <div class="form-group">
            @Html.LabelFor(model => model.Description, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Description)
                @Html.ValidationMessageFor(model => model.Description)
            </div>
        </div>

        <div>
            @Html.Label("Details.Name", new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.Editor("Details[0].Name")                
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

En otras palabras, cuando tengo que presentar, los datos no se unen a la Maestra.Detalles...

¿Fue útil?

Solución 2

La respuesta correcta está aquí, por estos motivos, debe escribir un aglutinante personalizado a MVC antes de enlazar sus datos a su ViewModel, crear una instancia de ViewModel y luego enlazar los datos a ViewModel.Puede ver una muestra de carpeta aquí (que ha escrito por mi querido desarrollador senior de Freind @Saeed Hamed)

public class InterfaceModelBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(Type modelType)
    {
        if (modelType.IsInterface)
        {
            return new InterfaceModelBinder();
        }
        return null;
    }
}
public class InterfaceModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var item = DependencyResolver.Current.GetService(bindingContext.ModelType);

        bindingContext.ModelMetadata = new ModelMetadata(new DataAnnotationsModelMetadataProvider(),
            bindingContext.ModelMetadata.ContainerType, () => item, item.GetType(), bindingContext.ModelName);

        return base.BindModel(controllerContext, bindingContext);
    }
}

Otros consejos

Se están haciendo algunas cosas mal aquí.

  1. Autofac no tiene nada que ver con el modelo de enlace.Autofac es para la inyección de dependencias en su constructor del controlador;el ASP.NET cuaderno de modelo MVC une las solicitudes de HTTP a los parámetros de acción.Ellos están completamente separados de las preocupaciones. Deshacerse de su IMaster la inyección de dependencia.
  2. MVC no se puede obligar a un post de formulario a una interfaz porque no sabe qué tipo concreto para crear una instancia.Olvidar el IMaster la interfaz y el uso de un concreto tipo de modelo.
  3. Formulario de puestos se unen a acción parámetros, no constructor los parámetros.Usted debe tener un método de acción que acepta un Master objeto.

Suponiendo que este es el índice de la acción, usted debe tener un método de acción que se ve algo como esto en el interior de su HomeController:

[HttpPost]
public ActionResult Index(Master model)
{
    ...
}

Usted puede necesitar para hacer otros cambios para llegar a donde vas, pero este debe de salir en la pista de la derecha (ahora su código es muy confuso).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top