.net mvc声明一个属性来保存一般对象的集合?

时间:2017-10-01 11:44:18

标签: c# .net entity-framework model-view-controller widget

我有一个使用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重新生成,所有这些都将丢失?)

1 个答案:

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