2012-06-10 110 views
6

我有一個MVC應用程序,我想顯示一個下拉列表與數據庫中的信息。MVC在哪裏邏輯去控制器或查看模型

下拉菜單將顯示來自數據庫的信息汽車使用表格Make是汽車的品牌。

所以,在我看來,我會碰到這樣的:

@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控制器,並給他們的視圖模型這是一個簡單的容器。

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

} 

因此,在這個選項我把邏輯得到的視圖模型正確carmakes。它不僅僅是一個容器。

所以我想知道的是這些方法中的哪一種是正確的做法?

回答

3

在控制器中。 ViewModel不應該知道你正在使用的工作單元。此外,如果不需要依賴邏輯x => x.Colour == "Red",則此情況下的視圖模型將更具可重用性。儘管這可以轉移到參數上,但總的來說,我相信您的模型(以及其中的視圖)在控制器中可以更好地重複使用。

0

您應該將您的邏輯添加到控制器。在MVC中,ViewModel是一個包含視圖中使用的屬性的對象,在那裏沒有業務邏輯。

0

任何答案都是非常主觀的,但我建議在您的視圖模型中使用_unitOfWork引用(或需要注入的任何依賴)而非暴力分離關注點。

保持它在控制器 - 更清潔。

3

已經回答了,它是控制器。爲了讓你更加難忘,我會這樣說。不要讓你的觀點直接與數據庫交談。僅查看詢問/談話。那麼顯然,視圖將請求發送給將其轉發給數據庫的控制器是有意義的。希望這有助於未來!

相關問題