Question

J'ai une interface qui a une propriété qui est une liste d'une autre interface et une classe qui a mis en place cette interface, je me suis inscrit pour Autofac, mais mon problème est Autofac pas lier les données à ma classe, j'ai écrit mon code ci-dessous :

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

Mes Classes :

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

Mon Contrôleur :

public class HomeController : Controller
    {
        IMaster _t;

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


    }

Mon Autofac Internet :

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

        }

et la vue est ici :

@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 d'autres mots, lorsque je soumets, les données se lie pas à Maîtriser.Détails...

Était-ce utile?

La solution 2

La bonne réponse est ici, pour cette raison, vous devez écrire un liant personnalisé à MVC avant de lier vos données sur votre viewModel, créez une instance de ViewModel, puis de lier les données à ViewModel.Vous pouvez voir un échantillon de classeur ici (qui a écrit par mon cher développeur senior 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);
    }
}

Autres conseils

Vous faites quelques choses de mal ici.

  1. Autofac n'a rien à voir avec le modèle de liaison.Autofac est pour l'injection de dépendances dans votre constructeur du contrôleur;l'ASP.NET liant de modèle MVC lie les requêtes HTTP vers les paramètres de l'action.Ils sont complètement séparés de leurs préoccupations. Se débarrasser de votre IMaster l'injection de dépendance.
  2. MVC ne peut pas lier un post de formulaire à une interface, car il ne sait pas ce type de béton à instancier.Oubliez le IMaster l'interface et l'utilisation d'une vision concrète du type de modèle.
  3. Formulaire de postes se lier à action paramètres, non constructeur les paramètres.Vous devriez avoir une méthode d'action qui accepte un Master objet.

En supposant que cela soit votre action index, vous devez avoir une méthode d'action qui ressemble à quelque chose comme ceci à l'intérieur de votre HomeController:

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

Vous devrez peut-être apporter d'autres modifications à arriver là où vous allez, mais ce devrait vous mettre sur la bonne voie (droite désormais votre code a l'air très confus).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top