Ich versuche, eine Web-App mit Visual Studio 2017, Entity Framework Core zu bauen. Ich möchte 2 Modelle in einer Ansicht kombinieren. Ich habe 2 Klassen - Unternehmen & Mitarbeiter, die ich kombinieren möchte. Ich möchte, dass die Mitarbeiterinformationen neben den Unternehmensinformationen angezeigt werden. Was ist der eleganteste Ansatz? Ich kämpfe ziemlich viel, da dies meine erste Web-App ist.C# - Mehrere Modelle in einer Ansicht in MVC?
Hier ist meine Basis-Code:
Modell:
using System;
using System.Collections.Generic;
namespace Company.Model
{
public class Company
{
public int CompanyID { get; set; }
public string CompanyWebsite { get; set; }
public string CompanyPresident { get; set; }
}
public class Employee
{
public int EmployeeID { get; set; }
public string Name { get; set; }
public string Position { get; set; }
public string Email { get; set; }
}
}
Dies ist mein Controller:
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 CompanyApp.Data;
using CompanyApp.Model;
namespace CompanyApp.Controllers
{
public class CompanyController : Controller
{
private readonly CompanyContext _context;
public CompanyController(ManagementContext context)
{
_context = context;
}
// GET: Companies
public async Task<IActionResult> Index()
{
return View(await _context.Companies.ToListAsync());
}
// GET: Company/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var company = await _context.Companies
.Include(s => s.CompanyEmployee)
.ThenInclude(e => e.Employee)
.AsNoTracking()
.SingleOrDefaultAsync(m => m.CompanyID == id);
if (company == null)
{
return NotFound();
}
return View(company);
}
// GET: Company/Create
public IActionResult Create()
{
return View();
}
// POST: Company/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("CompanyID,CompanyWebsite,CompanyPresident")] Company company)
{
if (ModelState.IsValid)
{
_context.Add(company);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(company);
}
// GET: Company/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var company = await _context.Companies.SingleOrDefaultAsync(m => m.CompanyID == id);
if (company == null)
{
return NotFound();
}
return View(company);
}
// POST: Companies/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("CompanyID,CompanyWebsite,CompanyPresident")] Company company)
{
if (id != company.CompanyID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(company);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!CompanyExists(company.CompanyID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction("Index");
}
return View(company);
}
// GET: Company/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var company = await _context.Companies
.SingleOrDefaultAsync(m => m.CompanyID == id);
if (company == null)
{
return NotFound();
}
return View(company);
}
// POST: Company/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var company = await _context.Companies.SingleOrDefaultAsync(m => m.CompanyID == id);
_context.Companies.Remove(company);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
private bool CompanyExists(int id)
{
return _context.Companies.Any(e => e.CompanyID == id);
}
}
}
Erstellen Sie ein Ansichtsmodell mit den Eigenschaften, die Sie in der Ansicht anzeigen/bearbeiten möchten. –
Ich schlage vor, eine Verbindung wie innerhalb des Unternehmensmodells eine Employee-Eigenschaft zu haben. Dann können Sie einfach eine Sammlung aller Mitarbeiter in diesem Unternehmen zurückgeben oder einen einzelnen Mitarbeiter basierend auf seiner ID zurückgeben. Auch Ihr Unternehmensmodell enthält nicht CompanyEmployee oder Employee, also wie können Sie sie im Include hinzufügen, da ich sicher bin, dass Unternehmen Ihr DbSet für Unternehmen ist. – Edward
Es gibt 10 verschiedene Möglichkeiten, wie Sie es tun können. Sehen Sie sich diesen Artikel https://www.codeproject.com/Articles/1108855/ways-to-Bind-Multiple-Models-on-AView-in-MVC – Hakunamatata