2014-01-10 84 views
0

我有创建EF(DB第一种方法)应用程序的MVC 5。我遇到的问题是正确显示每列中正确数据的列表。MVC 5 DB首先EF显示3类视图模型(DAL)

我有3个班在我的DAL:

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

我不知道这是否是我应该如何去这个正确的做法。我一直在玩这个,但没有取得太大的成功。我很感谢这里的任何帮助,提前致谢!

回答

0

您应该创建专用视图模型类。你提到的每个菜单项可能会或可能不会有PriceItem,为什么不为你的视图模型做到这一点:

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

我可以与视图模型下去,关键是不要试图强迫你的EF模型类作为视图模型。创建包含您需要的所有内容的特定视图模型。有时候人们会为视图编写全新的模型,然后通过控制器转换为域/ EF模型。

+0

也许我在这里想到的东西,但每个MenuItem有多个定价层(意味着多个价格)。因此,每行都由一个菜单项组成,这些菜单项包含多个列(定价层),可能会或可能不会填充,具体取决于menuitempricingtiers实体的数据。 – user3167029

+0

你还没有想过......只是改变视图模型然后..我会编辑我的答案。 –

相关问题