Wenn man in einer View Ansicht Daten von einer eingebundenen
Tabelle anzeigen möchte, dann verwendet man das sogenannte Eager loading.
Dabei wird in der View folgendes gemacht
Will man zum Beispiel in der folgenden Liste von
Artikeln auch die Bezeichung der zugeordneten Produktgruppen wissen, dann muss
man diese dazuladen.
Index-View
in Views/Artikel.cs
Artikel
|
Produktgruppe
|
Akkuschrauber
|
Akku-Schrauber
|
Maschine
|
Bohrmaschinen
|
Maschine 2
|
Bohrmaschinen
|
Dabei wird aus den Bewegungsdaten Artikel informationen
aus einer Basisdaten Datei Info geholt, wobei beide Tabellen über eine ID der
Infodatei verbunden sind.
Die Informationsdatei ist in diesem Fall die
Produktgruppen-Information.
Lösung:
Controller:
Im Artikel-Controller bindet man vor der Auflistung
.ToList() die referenzierten Werte ein mit einem .Include(verweis)
List<Artikel>
artikel = _context.Artikel.Include(a=>a.Produktgruppe
).ToList();
|
Für die Include() Anweisung muss der Entity Framework eingebunden
werden
using Microsoft.EntityFrameworkCore;
|
Model:
Im Model muss die referenzierende Tabelle eingebunden
sein
public Produktgruppen Produktgruppe { get; set; }
|
View:
In der View wird mit der Razor-Begriff direkt der
Feldwert der referenzierten Tabelle angegeben
@artikel.Produktgruppe.Produktgruppe
|
Die Datei Views/Artikel/Index.cs
View Code
@model
IEnumerable<ArtikelWeb.Models.Artikel >
..
@foreach (Artikel artikel in Model)
{
<tr>
<td>
@artikel.Title
</td>
<td>
@artikel.Produktgruppe.Produktgruppe
</td>
..
|
Dabei werden dann nur noch diese Daten angezeigt, welche
eine eindeutige Bindung zu der Produktgruppe haben.
Im Beispiel wird der erste Artikel mit einer 0 in der
IDProduktgruppe dann leider nicht mehr angezeigt.
Komplettes Beispiel Artikel Model
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; //*[key]
using System.Linq;
using System.Threading.Tasks;
namespace ArtikelWeb.Models
{
public class Artikel
{
[Key]
public int IDArtikel { get; set; }
public string Title { get; set; }
public string Text_Content { get; set; }
public Produktgruppen
Produktgruppe { get; set; }
public int IDProduktgruppe { get; set; }
}
}
|
Alle anderen Artikel, welche keinen Passenden Eintrag zu
einer Produktgruppe haben, werden nicht mehr gelistet. Das entspricht in SQL
einer Inner Join
Video Tutorial
https://www.youtube.com/watch?v=aOWht6j_6es&feature=youtu.be
Kompletter Controller Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using ArtikelWeb.Models;
using Microsoft.EntityFrameworkCore; //*DbContext or ApplicationDbContext
namespace ArtikelWeb.Controllers
{
public class ArtikelController : Controller
{
private readonly app_DbContext _context;
//ctor
public
ArtikelController(app_DbContext context)
{
_context = context;
}
protected override void Dispose(bool disposing)
{
_context.Dispose();
}
public IActionResult Index()
{
//List<Artikel>
artikel = _context.Artikel.ToList();
List<Artikel> artikel =
_context.Artikel.Include(a=>a.Produktgruppe ).ToList();
return View(artikel);
}
public IActionResult Details(int ID)
{
Artikel artikel=
_context.Artikel.SingleOrDefault(a =>a.IDArtikel == ID);
if (artikel == null) return NotFound();
return View(artikel);
}
public IActionResult Edit(int ProductID) //*Asp.Net convention
{
//--------< Detail() >------------
return Content("ID=" + ProductID);
//--------</ Detail()
>------------
}
}
}
|
Komplette Beispiel View Code /Views/Artikel/Index.cshtml
@model
IEnumerable<ArtikelWeb.Models.Artikel >
@*@model
ArtikelWeb.Models.Artikel*@
@{
ViewData["Title"] = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
<p>
<a asp-action="Create">Create New</a>
</p>
@*@if
(!Model.Any())
{
<p>Keine Artikel vorhanden
</p>
}
else
{*@
@*//-------- Tabelle: Artikel
--------*@
<table class="table">
<thead>
<tr>
<th>Artikel</th>
<th>Produktgruppe</th>
</tr>
</thead>
<tbody>
@foreach (Artikel artikel in Model)
{
<tr>
<td>
@artikel.Title
</td>
<td>
@artikel.Produktgruppe.Produktgruppe
</td>
<td>
<a asp-action="Edit" asp-route-id="@artikel.IDArtikel">Edit</a> |
<a asp-action="Details" asp-route-id="@artikel.IDArtikel">Details</a> |
<a asp-action="Delete" asp-route-id="@artikel.IDArtikel">Delete</a>
</td>
</tr>
}
</tbody>
</table>
@*//--------/ Tabelle:
Artikel --------*@
@*}*@
@*Aenderung:
Html.DisplayFor(modelItem =>
item.Title)
wird zu
artikel.Title*@
|