2017-10-01 2 views
0

Ich habe ein MVC-Projekt mit EF (Datenbank zuerst) und ich habe bereits CRUD für einige Entitäten erstellt. Jetzt versuche ich, eine Dashboard-Seite zu erstellen, die Widgets oder ähnliches enthält, die jeweils die Auflistung die letzten 10 Personen aus verschiedenen DB-Tabellen (letzte 10 Produkte erstellt, letzte 10 Kunden, etc.) Um das Widget zu erstellen ich dieses Tutorial gefolgt https://www.codeproject.com/Articles/598383/Widgets-in-MVC.net mvc eine Eigenschaft deklarieren, um eine Sammlung von generischen Objekten zu halten?

so habe ich 2-Schnittstellen und zwei Klassen, die diese Schnittstellen implementiert:

public interface IWidget 
{ 
    int SortOrder { get; set; } 
    string Entity { get; set; } 
    string CssClassName { get; set; } 
    string HeaderText { get; set; } 
    string FooterText { get; set; } 
    ISubWidget SubWidget { get; set; } 
} 

public interface ISubWidget 
{ 
    ICollection<Products> EntitiesList { get; set; } 
} 


public class Widget : IWidget 
{ 
    public int SortOrder { get; set; } 
    public string Entity { get; set; } 
    public string HeaderText { get; set; } 
    public string FooterText { get; set; } 
    public ISubWidget SubWidget { get; set; } 
} 

public class SubWidget : ISubWidget 
{ 
    public ICollection<Products> EntitiesList { get; set; } 
} 

dann habe ich 3 Teilansichten: eine für das Widget selbst, eine für die subwidget, und eine, die als Behälter handeln von alle erstellten Widgets

@model Proyect.Comun.Widget.IWidget 
<div class="widget"> 
    <div class="@Model.CssClassName"> 
     <div class="widgetHeader"> 
      @Model.HeaderText 
     </div> 
     <div class="widgetBody"> 
      @Html.Partial(string.Concat(new[] { "Widget", "/", "_SubWidget" }), @Model.SubWidget) 
     </div> 
     <div class="widgetFooter"> 
      @Model.FooterText 
     </div> 
    </div> 
</div> 


@model Proyect.Comun.Widget.ISubWidget 
<table> 
    @foreach (var item in Model.EntitiesList) 
    { 
     <tr> 
      <td> @Html.DisplayFor(modelItem => item.product_number) </td> 
      <td> @Html.DisplayFor(modelItem => item.product_name) </td> 
      <td> @Html.DisplayFor(modelItem => item.product_description) </td> 
     </tr> 
    } 
</table> 


@model Fruterias.Comun.Widget.IWidget 
@foreach (Proyect.Comun.Widget.IWidget wm in ViewBag.Widgets) 
{ 
    @Html.Partial(string.Concat(new[] { "Widget", "/", "_Widget" }), wm) 
} 

dann im Dashboard-Controller:

public ActionResult Index() 
{ 
    ViewBag.Widgets = GetWidgetData(); 
    return View(); 
} 


public List<IWidget> GetWidgetData() 
{ 
    var lastWidget = new List<IWidget>{ 
     new Widget() 
     { 
      SortOrder = 1, 
      CssClassName = "high", 
      Entity = "Products", 
      HeaderText = "Last Products", 
      FooterText = "", 
      SubWidget = new SubWidget { 
       EntitiesList = db.products.OrderByDescending(p => p.date).Take(10).ToList(), 
      } 
     }, 
    }; 
    return lastWidget; 
} 

Und schließlich in der Ansicht für Armaturenbrett/Index:

<p> 
    @{ 
     @Html.Partial("Widget/_WidgetContainer"); 
    } 
</p> 

Dies funktioniert ok und zeigt eine Liste von Produkteinheiten. Aber jetzt möchte ich verschiedene Widgets erstellen, die verschiedenen Entitäten zugeordnet sind. Natürlich ist das Problem, dass die Eigenschaft EntitiesList als eine Sammlung von Product-Objekten deklariert ist, so dass ich sie zB nicht mit Kundenobjekten füllen kann.

Was wäre die Lösung hier? Ich könnte verschiedene Schnittstellen (und Klassen) für jeden Entitätstyp erstellen, aber ich bin sicher, es muss einen besseren Weg geben ...

Auch, wie die Entitäten Modelle (Produkte, Kunden ...) mit Entity Framework generiert werden db zuerst, ich denke, ich kann nicht eine Schnittstelle erstellen und sie implementieren diese Schnittstelle (oder kann ich?) ... (immer wenn die db ändert und Modelle von EF neu generiert werden, alles was wäre verloren?)

Antwort

0

Wenn Sie müssen die EntitiesList nicht als einen bestimmten Typ haben, da Sie das SubWidget einfach als generisch definieren und seinen Typ bei der Instanziierung festlegen können.

public class SubWidget<T> : ISubWidget<T> where T : class 
{ 
    public ICollection<T> EntitiesList { get; set; } 
} 

oder Sie könnten dynamisches Objekt verwenden.

public class SubWidget : ISubWidget 
{ 
    public ICollection<dynamic> EntitiesList { get; set; } 
} 
Verwandte Themen