MVC逻辑应该在哪里进入Controller或View Model

Ano*_*use 6 asp.net-mvc

我有一个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.它不仅仅是一个容器.

所以我想知道的是,这些方法中的哪一种是正确的方法呢?

Joe*_*rra 3

在控制器中。ViewModel 不应该知道您正在使用的工作单元。此外,如果本例中的视图模型不必依赖于逻辑,那么它的可重用性会更高x => x.Colour == "Red"。尽管这可以转移到参数中,但总的来说,我相信您的模型(以及因此的视图)在控制器中处理后会更具可重用性。