2017-10-01 1 views
0

J'ai un projet MVC en utilisant EF (base de données d'abord) et j'ai déjà créé CRUD pour certaines entités. Maintenant j'essaie de créer une page de tableau de bord qui contient des widgets ou similaires, listant chacune les 10 dernières entités de différentes tables de db (10 derniers produits créés, 10 derniers clients, etc) Pour créer le widget J'ai suivi ce tutoriel https://www.codeproject.com/Articles/598383/Widgets-in-MVC.net mvc déclarer une propriété pour contenir une collection d'objets génériques?

J'ai donc 2 interfaces et 2 classes qui implémente ces interfaces:

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; } 
} 

j'ai 3 vues partielles: un pour le widget lui-même, un pour subwidget, et qui agira comme un récipient de tous les widgets créés.

@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) 
} 

puis dans le contrôleur Tableau de bord:

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; 
} 

Et enfin dans la vue de tableau de bord/Index:

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

Cela fonctionne bien et affiche une liste des entités du produit. Mais maintenant je veux créer différents widgets associés à différentes entités. Bien sûr, le problème est que la propriété EntitiesList est déclarée comme une collection d'objets Product, donc je ne peux pas la remplir avec, par exemple, des objets clients.

Quelle serait la solution ici? Je pourrais créer différentes interfaces (et classes) pour chaque type d'entité, mais je suis sûr qu'il doit y avoir un meilleur moyen ...

Aussi, comme les entités modèles (produits, clients ...) sont générés avec Entity Framework db d'abord, je suppose que je ne peux pas créer une interface et les faire implémenter cette interface (ou puis-je?) ... (quand les changements de db et les modèles sont régénérés par EF, tout ce qui serait perdu?)

Répondre

0

Si vous n'avez pas besoin d'avoir EntitiesList pour être un type spécifique, vous pourriez simplement avoir le SubWidget soit générique et définir son type lorsque vous instanciez.

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

ou vous pouvez utiliser un objet dynamique.

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