【问题标题】:Trying to send correctly formed object to view试图发送正确形成的对象来查看
【发布时间】:2019-06-18 03:21:45
【问题描述】:

我正在处理一个课堂/家庭作业项目,我正在尝试呈现一个显示订单详细信息的表单,每个产品标题显示在单独的行上。这是我的模型、控制器和视图(分别):

public class Order
  {
    [Key]
    public int OrderId {get;set;}

    [Required]
    [DataType(DataType.Date)]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime DateCreated {get;set;}

    [DataType(DataType.Date)]
    public DateTime? DateCompleted {get;set;}

    [Required]
    public string UserId {get; set;}

    [Required]
    public ApplicationUser User { get; set; }

    public int? PaymentTypeId {get;set;}
    public PaymentType PaymentType {get;set;}

    public virtual ICollection<OrderProduct> OrderProducts { get; set; }

    }
}


// GET: Orders/Details/5
        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var order = await _context.Order
                .Include(o => o.OrderProducts)
                    .ThenInclude(op => op.Product)
                .Where(o => o.OrderId == id).ToListAsync();

            if (order == null)
            {
                return NotFound();
            }

            return View(order);
        }

<dl class="row">
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.DateCreated)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.DateCreated)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.OrderProducts)
        </dt>
        <dd class="col-sm-10">
            @foreach (var product in Model.OrderProducts)
            {
                <div>
                    @Html.DisplayFor(Model => product.Product.Title)
                </div>
            }
        </dd>
    </dl>

我目前收到错误消息:

“InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为“System.Collections.Generic.List`1[Bangazon.Models.Order]”,但此 ViewDataDictionary 实例需要“Bangazon.Models”类型的模型项。订单'。”

我最初的想法是订单的 ICollection 的 OrderProducts 需要是一个列表,但这根本没有改变错误。所以,现在我很茫然。

感谢大家的考虑和耐心。我对开发还是很陌生。

【问题讨论】:

    标签: c# entity-framework linq model-view-controller


    【解决方案1】:
    var order = await _context.Order
                    .Include(o => o.OrderProducts)
                        .ThenInclude(op => op.Product)
                    .Where(o => o.OrderId == id).ToListAsync();
    

    这将为您提供订单列表。但你的观点期待秩序。

    var order = await _context.Order
                    .Include(o => o.OrderProducts)
                        .ThenInclude(op => op.Product)
                    .Where(o => o.OrderId == id).FirstOrDefaultAsync();
    

    FirstOrDefault 将在您的 where 中为您提供第一个项目。但你最好使用 SingleOrDefault()。

    【讨论】:

    • 您现在建议的更改会导致构建错误,即“订单”不包含“GetAwaiter”的定义...您能指导我如何纠正这个问题吗?谢谢。
    • 使用 FirstOrDefaultAsync
    • 我不熟悉那种方法。这正是我所需要的。再次感谢您。
    【解决方案2】:

    您的模型需要一个类,但查询的返回类型是 List。如果模型需要列表,则将模型放入列表中,然后为模型创建一个循环。

    @model List<Order>
    
    for (var i = 0; i <= Model.Count() - 1; i++){
        <dl class="row">
            <dt class="col-sm-2">
                @Html.DisplayNameFor(m => Model[i].DateCreated)
            </dt>
            <dd class="col-sm-10">
                @Html.DisplayFor(m => Model[i].DateCreated)
            </dd>
            <dt class="col-sm-2">
                @Html.DisplayNameFor(m => Model[i].OrderProducts)
            </dt>
            <dd class="col-sm-10">
                @foreach (var product in Model[i].OrderProducts)
                {
                    <div>
                        @Html.DisplayFor(Model => product.Product.Title)
                    </div>
                }
            </dd>
        </dl>
    }
    

    或者如果您只想要一个模型而不是遵循条件的模型列表,请遵循@cdev 建议

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 2015-12-30
      • 2021-01-23
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多