2017-04-20 4 views
0

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); 
     } 
    } 
} 
+3

Erstellen Sie ein Ansichtsmodell mit den Eigenschaften, die Sie in der Ansicht anzeigen/bearbeiten möchten. –

+0

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

+1

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

Antwort

0

Ein gutes Beispiel für diese Dinge können here finden ich in Gesellschaft Modell würde vorschlagen hinzufügen

public Company(){ Employee = new HashSet<Employee>(); } 
public virtual ICollection<Employee> Employee (get;set); 

und fügen Sie, um Mitarbeiter

[ForeignKey("Company")] 
public int CompanyId{get;set;} 
public virtual Company Company { get; set; } 

Neben mit Ihrer Bindung in der DbContext Klasse nicht der Controller

public class CompanyContext : DbContext { 
    public DbSet<Company> Companies { get; set; } 
    public DbSet<Employee> Employees { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Employee>(entity => 
     {entity.HasOne(d => d.Company) 
       .WithMany(p => p.Employee) 
       .HasForeignKey(d => d.CompanyId); 
     }); 
    } 
} 

Der Code für die Modelbuilder müssen möglicherweise einige Änderungen hinzuzufügen, auf Ihre Bedürfnisse arbeiten und Modelle

+0

Hallo Edward, ich benutze VS 2017, die nicht tut ' t unterstützen Sie Ihren Code. –

+0

Bitte erklären Sie, wie es nicht funktioniert. Mein Code basiert auf VS 2015 Community und funktioniert für ASPNetCore. Fügen Sie der Frage das Visual Studio 2017-Tag hinzu. – Edward

1

Sie sollten ein neues Modell erstellen, das alle erforderlichen Eigenschaften enthält. Zum Beispiel wie folgt:

public class CompanyModel 
    { 
     public int CompanyID { get; set; } 
     public string CompanyWebsite { get; set; } 
     public string CompanyPresident { get; set; } 
     public Employee Employee { get; set; } 
    } 

var company = await _context.Companies 
       .Include(s => s.CompanyEmployee) 
        .ThenInclude(e => e.Employee) 
        .AsNoTracking() 
       .SingleOrDefaultAsync(m => m.CompanyID == id); 

//Bind data from company into CompanyModel 
Verwandte Themen