2017-03-15 3 views
2

Ich habe gerade angefangen ASP.NET MVC Core-Lernen auf der Grundlage dieser first-mvc-app tutorialErstellen Sie mehrere Tabellen/Gitter

ich eine Datenbanktabelle ‚tblProducts‘ und ich kann eine einzelne Tabelle erstellen, um alle Produkte Auflistung

mit Modell:

public class tblProducts 
{ 
    //SQL table is named tblProducts 

    [Key] 
    public int ID { get; set; } 
    public DateTime Date { get; set; } 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
    public string Product { get; set; } //<<Want separate tables split by this field 
} 

Ansicht:

@model IEnumerable<LearnMVC.Models.tblProducts> 

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

<h2>Index</h2> 

<p> 
    <a asp-action="Create">Create New</a> 
</p> 
<table class="table"> 
    <thead> 
     <tr> 
      <th> 
       @Html.DisplayNameFor(model => model.Date) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.Field1) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.Field2) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.Product) 
      </th> 
      <th></th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach (var item in Model) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => item.Date) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Field1) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Field2) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Product) 
       </td> 
       <td> 
        <a asp-action="Edit" asp-route-id="@item.ID">Edit</a> | 
        <a asp-action="Details" asp-route-id="@item.ID">Details</a> | 
        <a asp-action="Delete" asp-route-id="@item.ID">Delete</a> 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 

Contoller: Standard MVC-Controller mit Ansichten, mit Entity Framework

public class tblProductsController : Controller 
{ 
    private readonly ApplicationDbContext _context; 

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

    // GET: tblProducts 
    public async Task<IActionResult> Index() 
    { 
     return View(await _context.tblProducts.ToListAsync()); 
    } 

    // GET: tblProducts/Details/5 
    public async Task<IActionResult> Details(int? id) 
    { 
     if (id == null) 
     { 
      return NotFound(); 
     } 

     var tblProducts = await _context.tblProducts.SingleOrDefaultAsync(m => m.ID == id); 
     if (tblProducts == null) 
     { 
      return NotFound(); 
     } 

     return View(tblProducts); 
    } 

    // GET: tblProducts/Create 
    public IActionResult Create() 
    { 
     return View(); 
    } 

    // POST: tblProducts/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("ID,Date,Field1,Field2,Product")] tblProducts tblProducts) 
    { 
     if (ModelState.IsValid) 
     { 
      _context.Add(tblProducts); 
      await _context.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 
     return View(tblProducts); 
    } 

    // GET: tblProducts/Edit/5 
    public async Task<IActionResult> Edit(int? id) 
    { 
     if (id == null) 
     { 
      return NotFound(); 
     } 

     var tblProducts = await _context.tblProducts.SingleOrDefaultAsync(m => m.ID == id); 
     if (tblProducts == null) 
     { 
      return NotFound(); 
     } 
     return View(tblProducts); 
    } 

    // POST: tblProducts/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("ID,Date,Field1,Field2,Product")] tblProducts tblProducts) 
    { 
     if (id != tblProducts.ID) 
     { 
      return NotFound(); 
     } 

     if (ModelState.IsValid) 
     { 
      try 
      { 
       _context.Update(tblProducts); 
       await _context.SaveChangesAsync(); 
      } 
      catch (DbUpdateConcurrencyException) 
      { 
       if (!tblProductsExists(tblProducts.ID)) 
       { 
        return NotFound(); 
       } 
       else 
       { 
        throw; 
       } 
      } 
      return RedirectToAction("Index"); 
     } 
     return View(tblProducts); 
    } 

    // GET: tblProducts/Delete/5 
    public async Task<IActionResult> Delete(int? id) 
    { 
     if (id == null) 
     { 
      return NotFound(); 
     } 

     var tblProducts = await _context.tblProducts.SingleOrDefaultAsync(m => m.ID == id); 
     if (tblProducts == null) 
     { 
      return NotFound(); 
     } 

     return View(tblProducts); 
    } 

    // POST: tblProducts/Delete/5 
    [HttpPost, ActionName("Delete")] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> DeleteConfirmed(int id) 
    { 
     var tblProducts = await _context.tblProducts.SingleOrDefaultAsync(m => m.ID == id); 
     _context.tblProducts.Remove(tblProducts); 
     await _context.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 

    private bool tblProductsExists(int id) 
    { 
     return _context.tblProducts.Any(e => e.ID == id); 
    } 
} 

Data \ ApplicationDbContext.cs:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 
     : base(options) 
    { 
    } 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     base.OnModelCreating(builder); 
     // Customize the ASP.NET Identity model and override the defaults if needed. 
     // For example, you can rename the ASP.NET Identity table names and more. 
     // Add your customizations after calling base.OnModelCreating(builder); 
    } 

    public DbSet<tblProducts> tblProducts { get; set; } 
} 

Bitte kann mir jemand helfen, erklären (oder wissen von jedem guten Tutorials) Wie kann ich mehrere Tabellen basierend auf den gleichen Modellfeldern erstellen, aber jede Tabelle wird durch die Spalte 'Produkt' geteilt?

Sagen, es gibt 5 Produkte, würde ich erwarten, 5 Tabellen alle mit den gleichen Feldern zu sehen Datum, Feld1, Feld2 & Produkt, aber das Produkt wäre einzigartig für jede Tabelle.

Ich werde nicht im Voraus wissen, wie viele Produkte es gibt, so brauchen einige Logik, um zu bestimmen, wie viele Tabellen benötigt werden. Da ich neu bin, bin ich unsicher, ob ich mehrere Modelle benötige oder ob etwas schlaues im Controller oder in der Ansicht gemacht werden kann, da die Daten alle aus derselben Tabelle stammen.

Ich habe ein paar Recherchen versucht, aber sie scheinen entweder nicht-mvc oder basierend auf mehreren verschiedenen Modellen (zB das ist ähnlich, aber http://www.compilemode.com/2016/09/show-multiple-table-data-on-view-in-asp-net-mvc.html hat pro Tabelle Quellen unterschiedliche Daten)

TL zu sein; DR: Wie sieht die ASP.NET MVC-Methode zum Anzeigen mehrerer Tabellen nach Feld aus einer einzelnen Datenbanktabelle aus?

+0

Wie lautet der Code für die Abfrage der Datenbank? Hier würden Sie angeben, auf welches Produkt die Daten "aufgeteilt" werden sollen. – sleeyuen

+0

Suchen Sie in Teilansichten und Anzeigevorlagen. Sie können ein View Model erstellen, um Ihre Daten so zu konvertieren, dass sie für Sie sinnvoll sind. Vielleicht gruppieren Sie die Datenmodell-Entitäten nach Produkt. Dann könnte Ihre Ansicht einfach Ihre Ansichtsmodell-Sammlung von Produkten durchlaufen, um für jede eine Tabelle anzuzeigen. – chadnt

Antwort

0

Aktualisiert die fiddle, um besser Ihre Anforderung in Bezug auf nicht zu wissen, wie viele Tabellen Sie benötigen - tut mir leid, verpasst, dass das erste Mal herum. Wie zuvor läuft die Geige nicht, aber es sollte dir eine gute Vorstellung davon geben, wo du damit hingehst.

Persönlich bevorzuge ich es, diese Art von Logik in der Ansicht zu haben, und es ist sicherlich möglich, es zurück zum Controller zu verschieben, aber denken Sie daran als mehr ein Proof of Concept.

+0

Danke für Ihre Hilfe. Wie würde ich damit umgehen, nicht zu wissen, wie viele Produkte es gibt? Die 'Klasse IndexViewModel' in Ihrem Beispiel geht davon aus, dass 3 Produkte hardcoodiert sind, aber es kann eine beliebige Anzahl sein, abhängig davon, was von der db-Tabelle zurückgegeben wird. – pathDongle

+0

Sorry, verpasste diese Anforderung beim ersten Mal - aktualisierte meine Antwort - hoffe, es hilft. – sleeyuen

+0

Das ist hervorragend und funktioniert gut, vielen Dank.Die einzige Änderung, die ich gemacht habe, ist, dass Sie 3 foreach Schleifen in der Ansicht haben, wenn nur 2 benötigt werden – pathDongle

Verwandte Themen