我尝试使用以下内容发布来自一堆文本字段的数据:
控制器:
[HttpGet]
public ActionResult Order()
{
OrderViewModel vm = new OrderViewModel();
vm.Id = "some id";
List<IOrderItem> itemList= new List<IOrderItem>();
for (int i = 0; i <= 10; i++)
{
OrderItem x = new OrderItem();
x.ItemId = i + "";
itemList.Add(x);
}
vm.OrderItemList = itemList;
return View(vm);
}
[HttpPost]
public IActionResult Order(OrderViewModel model)
{
return View("blabla");
}
这些是模型:
public class OrderViewModel : B.IOrderItemViewModel
{
private List<IOrderItem> orderItems;
public List<IOrderItem> OrderItemList
{
get { return orderItems; }
set { orderItems = value; }
}
private string orderId;
public string Id
{
get { return orderId; }
set { orderId = value; }
}
}
public class OrderItem : IOrderItem
{
private string orderItemId;
public string ItemId
{
get { return orderItemId; }
set { orderItemId = value; }
}
private string _description;
public string Description
{
get { return _description; }
set { _description = value; }
}
}
这是观点:
@model OrderViewModel
@using (Html.BeginForm("Order", "Home", FormMethod.Post))
{
@for (int i = 0; i < Model.OrderItemList.Count; i++)
{
@Html.HiddenFor(x => x.OrderItemList[i].ItemId)
@Html.TextBoxFor(x => x.OrderItemList[i].Description)
<br />
}
<input type="submit" value="submit" />
}
这是问题 - 接口在另一个项目中,我们称之为B.我在project.json文件中为主项目引用了B.在B中,我刚刚定义了两个接口是继承上面。
如果我不使用任何接口,我只使用这些对象 例如而不是:
List<IOrderItem> OrderItemList
我用:
List<OrderItem> OrderItemList
当我运行项目并点击视图时,我会看到文本框。我填写一些数据并点击提交。它按预期进入控制器。如果我在HttpPost actionresult方法中放置一个断点,并查看模型,我可以看到我输入的所有数据。完美。
如果我使用上面的代码,我从某些接口继承,它不起作用。视图加载,我输入一些数据,我发布,它命中断点,但模型为空,它全部为空。
非常感谢任何想法/帮助!
答案 0 :(得分:1)
你无法绑定到接口。模型绑定的过程包括首先初始化模型(在DefaultModelBinder
内部使用Activator.CreateInstance()
),但是您无法初始化接口(如何知道要初始化的类型),这就是为什么
public List<OrderItem> OrderItemList { get; set; }
有效,但
public List<IOrderItem> OrderItemList { get; set; }
不会
This article更详细地讨论了它,并包含了一个关于创建可以解决您的问题的自定义抽象模型绑定器的部分。