针对这种情况的理想(视图)模型设计

时间:2012-12-12 21:39:27

标签: asp.net-mvc-3 linq

我正试图将我的大脑包裹在视图模型周围以及何时适合使用它们。我想解释在这种情况下该怎么做:

型号:

public class Person
{
    public string firstName {set;get;}
    public string lastName {set;get;}
    public string City {set;get;}
    .... other junk
}

控制器:

IEnumerable<Person> model = db.Person
.Where(r => r.City == city)
.Select(r => new Person{ 
    firstName = r.firstName,
    lastName = r.lastName,
    something = r.something});

现在让我们说我的页面允许用户选择他想要过滤的city。另外,我只想显示firstNamelastName。这是使用viewmodel的时候吗?以前我会做这样的事情。

视图模型:

public class PersonViewModel
{
    public string firstName {set;get;}
    public string lastName {set;get;}
    public string cityChoice {set;get;}
    public IEnumerable<SelectListItem> cityList {set;get;}
}

我已经意识到,由于我的查询会返回一个类型IEnumerable<Person>,因此查询返回的每一行都会有一个cityList。更好的视图模型会是什么?我的下一步想法是将所有内容都设为IEnumerable

public class PersonViewModel
{
    public IEnumerable<string> firstName {set;get;}
    public IEnumerable<string> lastName {set;get;}
    public IEnumerable<string> cityChoice {set;get;}
    public IEnumerable<SelectListItem> cityList {set;get;}
}

这似乎不是一个明智的选择。它看起来很乱,实现也看起来很痛苦。

简而言之,在保持List<SelectListItem>的同时,将最少量的数据从控制器传递到视图的最佳方法是什么?我已经看到了通过viewbagviewdata传递列表的实现,但这看起来像是pad练习。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我会做两个视图模型 - 一个用于视图,一个用于数据:

public class CitySelectionVM {
  public string SelectedCity {set;get;}
  public IEnumerable<SelectListItem> CityList {set;get;}
  public IEnumerable<PersonVM> PersonList {set;get;}
}

此外,人物特定数据的第二个视图模型:

public class PersonVM
{
  public string FirstName {set;get;}
  public string LastName {set;get;}
}