Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Вывод дочерних записей на страницу

#c_sharp #aspnet #aspnet_mvc


Всем добрый день, кто сталкивался с такой проблемой. 

Есть таблица Накладная, у нее есть дочерняя таблица товары в накладной. И есть таблица
товаров.

MVC 5 Можно было на страницы сделать следующею конструкцию:

@foreach (var item in Model)
{

    
        @Html.DisplayFor(modelItem => item.Name)
    
    
        @foreach (var items in item.ListProdukts)
        {

                @Html.DisplayFor(modelItem => items.Produkts.ProduktName)
        }


Но в ASP.Net Core это не работает. При том что студия дает в подсказках кода все
эти поля.

Model:

namespace Proba3.Models
{
    public class Invoice
{
    public int InvoiceId { get; set; }
    public string InvoiceName { get; set; }
    public ICollection ListProdukts { get; set; }

}
}

namespace Proba3.Models
{
    public class ListProdukt
    {
        public int ListProduktId { get; set; }
        public int ProduktId { get; set; }
        public virtual Produkt Produkts { get; set; }

        public int InvoiceId { get; set; }
        public virtual Invoice Invoices { get; set; }
    }
}

 namespace Proba3.Models
 {
     public class Produkt
     {
        public int ProduktId { get; set; }
        public string ProduktName { get; set; }
        public ICollection ListProdukts { get; set; }
    }
}


Controllers:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using Proba3.Data;
using Proba3.Models;

namespace Proba3.Controllers
{
public class InvoicesController : Controller
{


    private readonly ApplicationDbContext _context;

    public InvoicesController(ApplicationDbContext context)
    {
        _context = context;    
    }

    // GET: Invoices
    public async Task Index()
    {
       var applicationDbContext = _context.Invoice.Include(c => c.ListProdukts);

        return View(await applicationDbContext.ToListAsync());
    }


Views:

@model IEnumerable

@{
    ViewData["Title"] = "Index";
}

Index

Create New

@foreach (var item in Model) {
@Html.DisplayNameFor(model => model.InvoiceName)
@Html.DisplayFor(modelItem => item.InvoiceName) @foreach (var items in item.ListProdukts) {

@Html.DisplayFor(modelItem => items.ProduktId)

@Html.DisplayFor(modelItem => items.Produkts.ProduktName)

}
Почему не показывает ProduktName?


Ответы

Ответ 1



Ответ дали на github. Оказывается ASP.NET Core теперь не добавляет дочерние элементы по умолчанию. Подробно можно прочесть на английском здесь: docs.asp.net В моем случае в Controller надо добавить: в строку: var applicationDbContext = _context.Invoice.Include(c => c.ListProdukts).ThenInclude(c => c.Produkts); вот это: .ThenInclude(c => c.Produkts);

Комментариев нет:

Отправить комментарий