MVC 5 DB第一个EF显示3类(DAL)的视图模型

时间:2014-01-10 21:15:29

标签: c# asp.net-mvc entity-framework

我正在创建一个带有EF(DB第一种方法)应用程序的MVC 5。我遇到的问题是在每列中正确显示包含正确数据的列表。

我的DAL中有3个课程:

public partial class MenuItem
{
    public int MenuItemID { get; set; }
    [DisplayName("Item Name")]
    public string name { get; set; }
    [DisplayName("Description")]
    public string description { get; set; }
    public int catID { get; set; }

    public virtual Category Category { get; set; }
}

public partial class PricingTier
{
    public PricingTier()
    {
        this.MenuItemsPricingTiers = new HashSet<MenuItemsPricingTier>();
    }

    public int PricingTierID { get; set; }
    public string tierName { get; set; }

    public virtual ICollection<MenuItemsPricingTier> MenuItemsPricingTiers { get; set;}
}

public partial class MenuItemsPricingTier
{
    public int MenuItemPricingTierID { get; set; }
    public int itemID { get; set; }
    public int tierID { get; set; }
    public Nullable<decimal> price { get; set; }
    public Nullable<int> sortOrder { get; set; }
    public Nullable<bool> hide { get; set; }

    public virtual PricingTier PricingTier { get; set; }
 }

我需要的视图是列出菜单项(按照传递给控制器​​的选定类别ID进行过滤),每个定价层都有一列。如果菜单项有菜单项定价层,我需要在该列中显示价格。问题是每个菜单项可能有也可能没有菜单项定价层。此外,由于菜单项定价层和菜单项之间没有外键,因此表格设计得很差。

我尝试创建一个viewmodel类来显示它,但我似乎无法将事物联系在一起。这是视图模型类:

public class MenuItemViewModel
{
    public MenuItemViewModel(MenuItem menuitem, IEnumerable<MenuItemsPricingTier>                       menuitemspricingtiers)
    {
        this.menuitem = menuitem;
        this.menuitemspricingtiers = menuitemspricingtiers.Where(x=>x.itemID == menuitem.MenuItemID);
    }
    public MenuItem menuitem { get; set; }
    public IEnumerable<MenuItemsPricingTier> menuitemspricingtiers { get; set; }
}

这是我的控制器:

    public ActionResult Index(int catID)
    {
        var menuitems = db.MenuItems.Include(m => m.Category);

        IEnumerable<MenuGridData> viewmodel = new IEnumerable<MenuGridData>();

        foreach (MenuItem mi in menuitems) {
            // add to viewmodel using repository.GetMenuItem(mi.MenuItemID) ??
        }


        IEnumerable<MenuItemsPricingTier> menuitemspricingtiers = repository.GetMenuItemsPricingTiers();

        return View(viewmodel);
    }

我不确定这是否是我应该怎么做的正确方法。我一直在玩这个没有太大成功。我很感激这里的任何帮助,提前谢谢!

1 个答案:

答案 0 :(得分:0)

您应该创建专用的视图模型类。您提到每个MenuItem可能有也可能没有PriceItem,为什么不为您的视图模型执行此操作:

 public class MenuItemViewModel
 {
     public MenuItem MenuItem { get; set; }
     public List<PriceItem> PriceItems { get; set; }
 }

我可以继续使用该视图模型,重点是不要尝试将EF模型类强制为视图模型。创建包含所需内容的特定视图模型。有时人们为视图编写全新的模型,然后通过控制器转换为Domain / EF模型。