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

时间:2012-06-10 20:58:57

标签: asp.net-mvc

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

如前所述,它是控制器。为了让你更难忘,我会这样说。不要让您的视图直接与数据库通信。查看仅向控制器询问/谈话。然后显然,视图向控制器发送请求是有意义的,控制器将请求转发到数据库。希望这有助于未来!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

任何答案都是非常主观的,但我建议在你的视图模型中使用_unitOfWork引用(或任何需要注入的依赖)而不是暴力分离关注点。

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