Pergunta

Eu tenho uma interface que possui uma propriedade que é uma lista de outra interface e uma classe que implementou essa interface, registrei-a no Autofac, mas meu problema é que o Autofac não vincula dados à minha classe, escrevi meu código abaixo:

Minhas 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; }
}

Minhas aulas :

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; }
}

Meu controlador:

public class HomeController : Controller
    {
        IMaster _t;

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


    }

Meu registro Autofac:

    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));            
            }

        }

e a vista está aqui:

@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>

Em outras palavras, quando eu envio, os dados não se vinculam ao Master.Details...

Foi útil?

Solução 2

a resposta certa está aqui, por esse motivo, você precisa escrever um fichário personalizado no mvc antes de vincular seus dados ao seu viewmodel, criar uma instância do viewmodel e, em seguida, vincular os dados ao viewmodel.você pode ver um exemplo do fichário aqui (que foi escrito pelo meu querido amigo desenvolvedor sênior @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);
    }
}

Outras dicas

Você está fazendo algumas coisas erradas aqui.

  1. Autofac não tem nada a ver com vinculação de modelo.Autofac serve para injetar dependências no construtor do seu controlador;o associador de modelo ASP.NET MVC vincula solicitações HTTP a parâmetros de ação.São preocupações completamente distintas. Livrar-se do seu IMaster Injeção de dependência.
  2. O MVC não pode vincular uma postagem de formulário a uma interface porque não sabe qual tipo concreto instanciar.Esqueça o IMaster interface e use um tipo de modelo de visão concreto.
  3. Postagens de formulário vinculadas a Ação parâmetros, não construtor parâmetros.Você deve ter um método de ação que aceite um Master objeto.

Supondo que esta seja sua ação de índice, você deve ter um método de ação parecido com este dentro do seu HomeController:

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

Talvez seja necessário fazer outras alterações para chegar aonde você está indo, mas isso deve colocá-lo no caminho certo (no momento, seu código parece muito confuso).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top