【问题标题】:Populating complex objects from view, on post, using interfaces使用接口在视图中填充复杂对象
【发布时间】: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 需要是唯一的。网上有很多文章进一步解释了这一点。我确实同意它更清洁,但这不是我遇到的问题。该代码在没有接口的情况下工作,它不与接口一起工作。我只是想了解原因。

标签: asp.net-mvc asp.net-core


【解决方案1】:

你不能绑定到接口。模型绑定的过程涉及到首先初始化你的模型(内部DefaultModelBinder使用Activator.CreateInstance()),但是你不能初始化一个接口(它怎么知道要初始化哪个类型),这就是为什么

public List<OrderItem> OrderItemList { get; set; }

有效,但是

public List<IOrderItem> OrderItemList { get; set; }

不会。

This article 对其进行了更详细的讨论,并包含一个关于创建自定义抽象模型绑定器的部分,它可能会解决您的问题。

【讨论】:

  • 正是我想要的。谢谢!
猜你喜欢
  • 2011-03-11
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2011-09-06
相关资源
最近更新 更多