lan*_*der 5 model-view-controller asp.net-mvc viewmodel
我一直在研究mvc的视图模型,我正在寻找最好的方法来实现它们.我读过很多不同的文章,但似乎没有一个明确的"最佳方式".到目前为止,我可能有一个具有以下属性的Customer模型:
其中location是数据库中位置表的外键.
我希望能够编辑此客户,但只能编辑名字,姓氏和位置.我对编辑中的标题并不感到烦恼.因此,在我看来,我需要传递一个客户和一个选定的列表.
从我读过的内容来看,我有以下几种选择(可能还有更多).
所以我的问题基本上哪个是最好的?
1)
添加一个选择列表ViewData["Location"],只是创建一个强类型的客户视图?
2)
创建一个视图模型,我传递客户并选择列表(数据访问在控制器中完成):
public class ViewModelTest
{
public Customer Customer { get; set; }
public SelectList Locations { get; set; }
public ViewModelTest(Customer customer, SelectList locations)
{
Customer = customer;
Locations = locations;
}
}
Run Code Online (Sandbox Code Playgroud)
3)
创建一个视图模型,我在其中传递客户和位置列表,并在视图模型中创建选择列表.
public class ViewModelTest
{
public Customer Customer { get; set; }
public SelectList Locations { get; set; }
public ViewModelTest(Customer customer, List<Location> locations, string selectedLocation)
{
Customer = customer;
Locations = new SelectList(locations, "LocationID", "LocationName", selectedLocation);
}
}
Run Code Online (Sandbox Code Playgroud)
4)
传递客户和存储库,并在视图模型中执行数据访问.
public class ViewModelTest
{
public Customer Customer { get; set; }
public SelectList Locations { get; set; }
public ViewModelTest(Customer customer, IRepository repository, string selectedLocation)
{
Customer = customer;
Locations = new SelectList(repository.GetLocations(), "LocationID", "LocationName", selectedLocation);
}
}
Run Code Online (Sandbox Code Playgroud)
5)
使用我需要的属性创建视图模型:
public class ViewModelTest
{
public string FirstName { get; set; }
public string LastName { get; set; }
public SelectList Locations { get; set; }
public ViewModelTest(Customer customer, SelectList locations)
{
FirstName = customer.FirstName;
LastName = customer.LastName ;
Locations = locations;
}
}
Run Code Online (Sandbox Code Playgroud)
6)
或者上述或其他方式的其他组合.
欢迎所有意见.
以下是我的建议:有一个反映强类型视图字段的视图模型:
public class SomeViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Location { get; set; }
public IEnumerable<SelectListItem> PossibleLocations { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在您的控制器操作中填充此视图模型:
public ActionResult Index()
{
var customer = Repository.GetCustomer();
var locations = Repository.GetLocations();
var viewModel = new SomeViewModel
{
FirstName = customer.FirstName,
LastName = customer.LastName,
Location = customer.Location,
PossibleLocations = new SelectList(locations, "LocationID", "LocationName", customer.Location);
};
return View(viewModel);
}
[HttpPost]
public ActionResult Index(SomeViewModel viewModel)
{
// TODO: Handle the form submission
return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)
当然,如图所示,手动完成模型和视图模型之间的映射可能会变得非常麻烦,在这种情况下,我建议您查看AutoMapper.
| 归档时间: |
|
| 查看次数: |
1111 次 |
| 最近记录: |