【发布时间】:2015-02-10 11:32:40
【问题描述】:
我正在尝试使用以下内容从一堆文本字段中发布数据:
控制器:
[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,A。在B中,我只是定义了上面继承的两个接口。
如果我不使用任何接口,我只使用对象 例如而不是:
List<IOrderItem> OrderItemList
我用:
List<OrderItem> OrderItemList
当我运行项目并点击视图时,我会看到文本框。我填写了一些数据并点击提交。它按预期进入控制器。如果我在 HttpPost actionresult 方法中放一个断点,然后查看模型,我可以看到我输入的所有数据。完美。
如果我使用上面的代码,我从某些接口继承,它不起作用。视图加载,我输入一些数据,我发布,它到达断点,但模型是空的,它都是空的。
任何想法/帮助将不胜感激!
【问题讨论】:
-
旁注,您可以使用 Razor
@foreach语法。您不需要索引变量,它会自动遍历列表,您不必再次通过索引访问(orderItem.ItemId而不是x.OrderItemList[i].ItemId) -
我认为这行不通。如果我使用 foreach,则每个输入的 ID 和名称值将完全相同。使用 for 的目的是让每个名称都是唯一的。
-
我建议您在拒绝之前尝试我的建议。它将导致更简洁的语法,从而使您的网站更易于更新和调试。
-
我不会拒绝它。我试过了。它不能工作,因为 id 需要是唯一的。网上有很多文章进一步解释了这一点。我确实同意它更清洁,但这不是我遇到的问题。该代码在没有接口的情况下工作,它不与接口一起工作。我只是想了解原因。