我有一个使用EF(数据库优先)的MVC项目,我已经为某些实体创建了CRUD。 现在我正在尝试创建一个包含小部件或类似小部件的仪表板页面,每个小部件列出来自不同数据库表的最后10个实体(最近创建的10个产品,最后10个客户等) 要创建小部件,我已按照本教程https://www.codeproject.com/Articles/598383/Widgets-in-MVC
进行操作所以我有2个接口和2个实现这些接口的类:
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; }
}
然后我有3个部分视图:一个用于小部件本身,一个用于子小部件,另一个用作所有创建的小部件的容器。
@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)
}
然后在仪表板控制器中:
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;
}
最后在Dashboard / Index的视图中:
<p>
@{
@Html.Partial("Widget/_WidgetContainer");
}
</p>
这样可以正常显示产品实体列表。但现在我想创建与不同实体关联的不同小部件。 当然问题是属性EntitiesList被声明为Product对象的集合,所以我不能用例如customer对象填充它。
这里有什么解决方案?我可以为每种类型的实体创建不同的接口(和类),但我确定必须有更好的方法......
此外,由于实体模型(Products,Customers ...)首先使用Entity Framework db生成,我想我无法创建一个接口并让它们实现该接口(或者我可以吗?)...(随时)数据库更改和模型由EF重新生成,所有这些都将丢失?)
答案 0 :(得分:0)
如果您不需要将EntitiesList作为特定类型,则可以让SubWidget成为通用的,并在实例化时设置其类型。
public class SubWidget<T> : ISubWidget<T> where T : class
{
public ICollection<T> EntitiesList { get; set; }
}
或者您可以使用动态对象。
public class SubWidget : ISubWidget
{
public ICollection<dynamic> EntitiesList { get; set; }
}