Попытка отправить правильно сформированный объект для просмотра - PullRequest
0 голосов
/ 18 июня 2019

Я работаю над проектом класса / домашней работы и пытаюсь создать форму, которая отображает детали заказа с каждым названием продукта, отображаемым в отдельной строке.Вот моя модель, контроллер и представление (соответственно):

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.Order '. "

Сначала я думал, что порядокICollection of OrderProducts должен был быть списком, но это совсем не изменило ошибку.Итак, теперь я в растерянности.

Спасибо всем за внимание и терпение.Я все еще очень новичок в разработке.

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Для вашей модели требуется класс, но тип возвращаемого вами запроса - Список. Если модель должна быть списком, поместите модель в список, а затем создайте цикл для модели.

@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

0 голосов
/ 18 июня 2019
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 даст вам первый элемент в вашем месте. Но вам лучше использовать SingleOrDefault ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...