autofac не привязывает данные к viewmodel
-
02-01-2020 - |
Вопрос
У меня есть интерфейс, который имеет свойство, представляющее собой список другого интерфейса, и класс, который реализовал этот интерфейс, я зарегистрировал его для 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);
}
}
. Другие советы
Здесь вы делаете несколько вещей неправильно.
- Autofac не имеет никакого отношения к привязке модели.Autofac предназначен для внедрения зависимостей в конструктор вашего контроллера;связующее средство модели ASP.NET MVC связывает HTTP-запросы с параметрами действия.Это совершенно разные проблемы. Избавиться из вашего
IMaster
внедрение зависимостей. - MVC не может привязать сообщение формы к интерфейсу, потому что он не знает, какой конкретный тип создавать.Забудь о
IMaster
интерфейс и использовать конкретный тип модели представления. - Сообщения формы привязываются к Экшен параметры, а не конструктор параметры.У вас должен быть метод действия, который принимает
Master
объект.
Предполагая, что это ваше индексное действие, у вас должен быть метод действия, который выглядит примерно так внутри вашего HomeController
:
[HttpPost]
public ActionResult Index(Master model)
{
...
}
Возможно, вам потребуется внести другие изменения, чтобы добраться туда, куда вы направляетесь, но это должно направить вас на правильный путь (прямо сейчас ваш код выглядит очень запутанным).