在 MVC 中,没有可绑定的网格视图,也没有与 Web 表单不同的视图状态。对于模型部分,最好将其扩展为使用与模型/域模型分开的视图模型。
将视图模型视为可以让您更好地控制来自数据库的数据的东西。请注意,在下面的PersonViewModel 中,我选择排除映射到表主键的PersonID。我还添加了一个返回此人全名(姓氏、名字)的字段。这些更改仅与视图模型隔离,不会影响域模型。
模型(可以映射到数据库表/列):
public class Person
{
[Key]
public Guid PersonID { get; set; }
public string Title { get; set; }
public string ForeName { get; set; }
public string SurName { get; set; }
public string TelNum { get; set; }
public string AddressString { get; set; }
}
ViewModel(本质上让您可以更好地控制页面上显示的内容):
public class PersonViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string Telephone { get; set; }
public string Title { get; set; }
public string FullName
{
get { return string.Format("{0}, {1}", this.LastName, this.FirstName); }
}
}
控制器代码(您可以在其中将字段的值从域模型传输到视图模型。为简单起见,我选择手动分配字段值,但有类似 AutoMapper 的工具可以简化此操作):
public ActionResult Index()
{
// returns List<Person> from the database
var peopleList = datasource.GetPeople();
var peopleVM = new List<PersonViewModel>();
//create a list of PersonViewModels
foreach (person in peopleList)
{
var personVM = new PersonViewModel()
{
FirstName = person.ForeName;
LastName = person.SurName;
Address = person.AddressString;
Title = person.Title;
Telephone = person.TelNum;
};
peopleVM.Add(personVM);
}
return View(peopleVM);
}
视图(您将在其中显示视图模型。实际上没有“绑定”的概念和开箱即用的视图状态,例如 web 表单,也没有太多内置控件,如 gridviews/listviews,除非您打算使用 MVC像these这样的扩展名):
@model List<Namespace.Models.PersonViewModel>
<table>
@foreach (person in Model)
{
<tr>
<td>person.FullName</td>
<td>person.Title</td>
<td>person.Telephone</td>
<td>person.Address</td>
</tr>
}
</table>
至于优质资源的链接,this site 和 this one too 不会出错。