MVC视图模型组织

时间:2012-01-30 22:19:57

标签: model-view-controller asp.net-mvc-2

我是MVC的新手,我试图了解如何组织我的ModelViews。第一个问题是Drop Down数据。我有一个设备模型和一个看起来像这样的EquipmentViewModel:

public class EquipmentViewModel
{
    public Equipment Equipment { get; private set; }
    public SelectList EquipmentCategories { get; private set; }
    private MyEntities db = new MyEntities();

    public EquipmentViewModel(Equipment equipment)
    {
        Equipment = equipment;
        EquipmentCategories = new SelectList(db.EquipmentCategories.Where(c => c.IsActive),
                                                      "EquipmentCategoryID", "Description");
    }

请注意我的类别下拉列表的SelectList。这一切都很好。但是,我有另一个名为库存的模型。库存具有EquipmentID属性(对应于您看到的设备)。对于库存项目的创建,对设备类别下拉是有用的。我已经在我的EquipmentViewModel中有这个选择列表,并且在如何为InventoryViewModel复制该代码时感觉不对。

我考虑过这样的事情:

public class InventoryViewModel
{
    MyEntities db = new MyEntities();

    public Inventory Inventory { get; set; }
    public EquipmentViewModel EquipmentViewModel { get; set; }

}

这对我来说似乎没问题,除了我将有一个InventoryViewModel的索引页面。基本上我会返回一个InventoryViewModel列表,每个ListViewModel都有一个EquipmentViewModel,其中每个都有完全相同的类别列表。这也是错误的,我认为我误解了MVC难题的一些关键部分。

这也引出了我的第二个问题:我如何从控制器中返回这样的怪物?我想它看起来像这样:

var list = db.Inventories
           .Select(i => new InventoryViewModel
           {
               Inventory = i,
               EquipmentViewModel = new EquipmentViewModel(i.EquipmentID)
           });

这意味着我基本上要为每个EquipmentID单独访问数据库(在EquipmentViewModel构造函数内),而不是能够加入id。例如,如果我只需要描述,我可以这样做:

var list = from i in db.Inventories
                   join e in db.Equipments
                   on i.EquipmentID equals e.EquipmentID
                   select new InventoryViewModel
                   {
                       Inventory = i,
                       EquipmentName = e.Description
                   };

我认为这会有更好的表现。我非常感谢任何人都可以提供的任何智慧。谢谢!

1 个答案:

答案 0 :(得分:0)

我有你的想法,

如果他们在做同样的事情,那么你的观点是没有意义的。然而,如果它们没有完全相同,那么放弃或创建新视图比拥有一个为所有部分共享的大视图更好。

你可以拥有这样的模型

public class InventoryViewModel{


// contains all categories for every inventory
public  SelectListItem EquipmentSelect {get;set;}  

//this will contain all the items you want to assign
public List<Inventories> ListOfInventories{get;set;}
}

在视图中,您可以为其中的选择列表项创建每个项目的部分视图