【发布时间】:2014-08-02 04:33:24
【问题描述】:
我有一个接口,它的属性是另一个接口的列表和一个实现该接口的类,我为 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;
}
}
我的 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));
}
}
视图就在这里:
@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.Details...
【问题讨论】:
-
你的接口没用。接口旨在隐藏行为,但您隐藏的是数据。您的视图模型对象是带有数据的普通 DTO;没有行为。这些不应该由您的 DI 库构建。 DI 库旨在构建服务的对象图。请阅读newables and injectables之间的区别。
-
@Html.Editor("Details.Name")实际呈现的是什么?可能应该是@Html.EditorFor(m => m.Details)才能正确显示Details.ID和Details.Name的索引属性
标签: c# asp.net-mvc interface inversion-of-control autofac