我正在创建一个带有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);
}
我不确定这是否是我应该怎么做的正确方法。我一直在玩这个没有太大成功。我很感激这里的任何帮助,提前谢谢!
答案 0 :(得分:0)
您应该创建专用的视图模型类。您提到每个MenuItem可能有也可能没有PriceItem,为什么不为您的视图模型执行此操作:
public class MenuItemViewModel
{
public MenuItem MenuItem { get; set; }
public List<PriceItem> PriceItems { get; set; }
}
我可以继续使用该视图模型,重点是不要尝试将EF模型类强制为视图模型。创建包含所需内容的特定视图模型。有时人们为视图编写全新的模型,然后通过控制器转换为Domain / EF模型。