Вопрос

У меня есть интерфейс, который имеет свойство, представляющее собой список другого интерфейса, и класс, который реализовал этот интерфейс, я зарегистрировал его для Autofac, но моя проблема в том, что Autofac не привязывает данные к моему классу, я написал свой код ниже :

Мои интерфейсы :

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

Мои Занятия :

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

Мой Контроллер :

public class HomeController : Controller
    {
        IMaster _t;

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


    }

Моя Автоматическая регистрация на Факе :

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

        }

и этот вид находится здесь :

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

Другими словами, когда я отправляю данные, они не привязываются к Master.Подробные сведения...

Это было полезно?

Решение 2

Правильный ответ здесь, поскольку для этой причины необходимо написать пользовательское связующее значение MVC, прежде чем привязывать ваши данные на свой ViewModel, создайте экземпляр ViewModel, а затем связывайте данные для ViewModel.Вы можете увидеть образец связующего здесь (который написал моим дорогим популярным старшим разработчиком @saeeed 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);
    }
}
.

Другие советы

Здесь вы делаете несколько вещей неправильно.

  1. Autofac не имеет никакого отношения к привязке модели.Autofac предназначен для внедрения зависимостей в конструктор вашего контроллера;связующее средство модели ASP.NET MVC связывает HTTP-запросы с параметрами действия.Это совершенно разные проблемы. Избавиться из вашего IMaster внедрение зависимостей.
  2. MVC не может привязать сообщение формы к интерфейсу, потому что он не знает, какой конкретный тип создавать.Забудь о IMaster интерфейс и использовать конкретный тип модели представления.
  3. Сообщения формы привязываются к Экшен параметры, а не конструктор параметры.У вас должен быть метод действия, который принимает Master объект.

Предполагая, что это ваше индексное действие, у вас должен быть метод действия, который выглядит примерно так внутри вашего HomeController:

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

Возможно, вам потребуется внести другие изменения, чтобы добраться туда, куда вы направляетесь, но это должно направить вас на правильный путь (прямо сейчас ваш код выглядит очень запутанным).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top