我有一个MVC应用程序,我想要显示一个包含数据库信息的下拉列表。
下拉列表将显示来自数据库Cars的信息,使用表格Make是汽车的品牌。
所以在我看来,我会有类似的东西:
@model VectorCheck.ViewModels.CarsViewModel
...
@Html.DropDownListFor(modelItem => Model.MakeId, Model.Makes)
...
所以不知怎的,我需要让视图模型得到make。
所以我可能有一些逻辑可以说这只说红色的汽车。
var redCars = _unitOfWork.Cars(x => x.Colour == "Red");
所以我的问题是为这个查询提供逻辑的最佳实践在哪里。它应该放在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));
}
视图模型
public Car Car { get; set; }
public IEnumerable<SelectListItem> CarMakes { get; set; }
InsertUpdateCarViewModel(Car car, IEnumerable<SelectListItem> carMakes)
{
Car= car;
CarMakes = carMakes;
}
所以在这个例子中,我在控制器中获取carMakes并将它们提供给viewModel,它只是一个容器。
Opon 2:viewModel
public ActionResult Edit(int id)
{
var car = _unitOfWork.CarRepository.Get(id);
return View("Edit", new InsertUpdateCarViewModel(car));
}
视图模型
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 });
}
所以在这个选项中,我将逻辑放在视图模型中获取正确的carmakes。它不仅仅是一个容器。
所以我想知道的是,这些方法中的哪一种是正确的方法呢?
答案 0 :(得分:3)
在控制器中。 ViewModel不应该知道您正在使用的工作单元。此外,如果不必依赖逻辑x => x.Colour == "Red"
,在这种情况下的视图模型将更加可重用。虽然这可以转移到参数上,但总的来说,我相信你的模型(及其视图)在控制器中可以更加重复使用。
答案 1 :(得分:3)
如前所述,它是控制器。为了让你更难忘,我会这样说。不要让您的视图直接与数据库通信。查看仅向控制器询问/谈话。然后显然,视图向控制器发送请求是有意义的,控制器将请求转发到数据库。希望这有助于未来!
答案 2 :(得分:0)
您应该将您的逻辑添加到Controller。在MVC中,ViewModel是一个对象,它包含视图中使用的属性,其中没有业务逻辑。
答案 3 :(得分:0)
任何答案都是非常主观的,但我建议在你的视图模型中使用_unitOfWork
引用(或任何需要注入的依赖)而不是暴力分离关注点。
将它保存在控制器中 - 更清洁。