我正试图将我的大脑包裹在视图模型周围以及何时适合使用它们。我想解释在这种情况下该怎么做:
型号:
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
。另外,我只想显示firstName
和lastName
。这是使用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>
的同时,将最少量的数据从控制器传递到视图的最佳方法是什么?我已经看到了通过viewbag
或viewdata
传递列表的实现,但这看起来像是pad练习。提前谢谢。
答案 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;}
}