我有一个MVC应用程序,我想显示一个包含数据库信息的下拉列表.
下拉列表将显示来自数据库汽车的信息使用表格Make是汽车的品牌.
所以在我看来,我会有类似的东西:
@model VectorCheck.ViewModels.CarsViewModel
...
@Html.DropDownListFor(modelItem => Model.MakeId, Model.Makes)
...
Run Code Online (Sandbox Code Playgroud)
所以我需要让视图模型得到make的列表.
所以我可能有一些逻辑可以说这只说红色的汽车.
var redCars = _unitOfWork.Cars(x => x.Colour == "Red");
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为这个查询提供逻辑的最佳实践.它应该放在viewModel还是控制器中.
我看到它的方式我有两个选项.
选项1:控制器.
public ActionResult Edit(int id)
{
var car = _unitOfWork.CarRepository.Get(id);
var carMakes = _unitOfWork.CarMakeRepository.Where(x => x.Colour == "Red").Select(u => new SelectListItem { Value = u.CarMakeId.ToString(), Text = u.Name });
return View("Edit", new InsertUpdateCarViewModel(car, carMakes));
}
Run Code Online (Sandbox Code Playgroud)
视图模型
public Car Car { get; set; }
public IEnumerable<SelectListItem> CarMakes { get; set; }
InsertUpdateCarViewModel(Car car, IEnumerable<SelectListItem> carMakes)
{
Car= car;
CarMakes = carMakes;
}
Run Code Online (Sandbox Code Playgroud)
所以在这个例子中,我在控制器中获取carMakes并将它们提供给viewModel,它只是一个容器.
Opon 2:viewModel
public ActionResult Edit(int id)
{
var car = _unitOfWork.CarRepository.Get(id);
return View("Edit", new InsertUpdateCarViewModel(car));
}
Run Code Online (Sandbox Code Playgroud)
视图模型
public Car Car { get; set; }
public IEnumerable<SelectListItem> CarMakes { get; set; }
InsertUpdateCarViewModel(Car car)
{
Car= car;
CarMakes = _unitOfWork.CarMakeRepository.Where(x => x.Colour == "Red").Select(u => new SelectListItem { Value = u.CarMakeId.ToString(), Text = u.Name });
}
Run Code Online (Sandbox Code Playgroud)
因此,在这个选项中,我将逻辑放在视图模型中获取正确的carmakes.它不仅仅是一个容器.
所以我想知道的是,这些方法中的哪一种是正确的方法呢?
在控制器中。ViewModel 不应该知道您正在使用的工作单元。此外,如果本例中的视图模型不必依赖于逻辑,那么它的可重用性会更高x => x.Colour == "Red"。尽管这可以转移到参数中,但总的来说,我相信您的模型(以及因此的视图)在控制器中处理后会更具可重用性。
| 归档时间: |
|
| 查看次数: |
1061 次 |
| 最近记录: |