6

我有一个 MVC 应用程序,我想在其中显示一个包含数据库信息的下拉列表。

下拉列表将使用汽车制造商表 Make 显示来自数据库 Cars 的信息。

所以在我看来,我会有类似的东西:

@model VectorCheck.ViewModels.CarsViewModel
...

@Html.DropDownListFor(modelItem => Model.MakeId, Model.Makes)
...

所以我需要以某种方式获取视图模型的制作列表。

所以我可能有一些逻辑去说只有红色的汽车。

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:视图模型

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 });

}

所以在这个选项中,我将逻辑放在视图模型中获取正确的汽车制造商。它不仅仅是一个容器。

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

4

4 回答 4

3

正如已经回答的那样,它是控制器。为了让你更难忘,我会这样说。不要让您的视图直接与数据库对话。View 仅询问/与控制器交谈。那么显然,视图向控制器发送请求,控制器将请求转发到数据库是有意义的。希望这对未来有所帮助!

于 2012-06-10T21:07:35.947 回答
3

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

于 2012-06-10T21:01:58.113 回答
0

任何答案都是非常主观的,但我建议_unitOfWork在您的视图模型中拥有参考(或任何需要注入的依赖项)相当暴力分离关注点。

将其保存在控制器中 - 更清洁。

于 2012-06-10T21:04:02.683 回答
0

您应该将逻辑添加到控制器。在 MVC 中,ViewModel 是一个包含视图中使用的属性的对象,其中没有业务逻辑。

于 2012-06-10T21:01:37.273 回答