2012-06-10 7 views
6

MVCアプリケーションを使用して、データベースから情報をドロップダウンリストに表示したいと考えています。MVCコントローラまたはビューモデルのロジックはどこにあるのですか

ドロップダウンでは、車のメイクテーブルであるテーブルを使用してデータベース車の情報が表示されます。

だから、私の見解では、私のようなものがあります:

@model VectorCheck.ViewModels.CarsViewModel 
... 

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

をだから、何とか私は、ビューモデルを作るのリストを取得する必要があります。

だから、私はこれと一緒に行くいくつかの論理を持っているかもしれませんが、色は赤色の車だけです。

var redCars = _unitOfWork.Cars(x => x.Colour == "Red"); 

私の質問は、このクエリのロジックを置くためのベストプラクティスです。それはviewModelまたはコントローラ内になければならない。

私の見方には2つのオプションがあります。

オプション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)); 
     } 

のViewModel

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

のViewModel

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

既に回答したように、コントローラです。それをもっと思い出深いものにするために、私はこれをこのようにします。あなたの意見を直接データベースに話させてはいけません。唯一のコントローラに尋ねる/会話を表示します。次に、ビューがコントローラに要求を送信してデータベースに転送することは明らかです。これが将来に役立つことを願っています!

関連する問題