6

データベースからの情報を含むドロップダウンリストを表示したいMVCアプリがあります。

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

したがって、私の見解では、次のようなものになります。

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

}

したがって、このオプションでは、ビューモデルで正しいカーメイクを取得するためのロジックを配置しています。それは単なるコンテナではありません。

だから私が知りたいのは、これらの方法のどれがこれを行う正しい方法であるかということです。

4

4 に答える 4

3

コントローラ内。ViewModelは、使用している作業単位を認識してはなりません。また、この場合のビューモデルは、ロジックに依存する必要がなければ、はるかに再利用可能ですx => x.Colour == "Red"。これは議論に移すことができますが、一般的に、あなたのモデル(およびそのためのビュー)は、コントローラーでそれを処理することではるかに再利用可能になると思います。

于 2012-06-10T21:01:58.113 に答える
3

すでに答えたように、それはコントローラーです。あなたにとってそれをより思い出深いものにするために、私はそれをこのように置きます。ビューがデータベースと直接通信しないようにしてください。コントローラーへの質問/会話のみを表示します。次に、ビューがデータベースに転送するコントローラーに要求を送信することは明らかに理にかなっています。これが将来に役立つことを願っています!

于 2012-06-10T21:07:35.947 に答える
0

ロジックをコントローラーに追加する必要があります。MVCでは、ViewModelはビューで使用されるプロパティを含むオブジェクトであり、ビジネスロジックは含まれていません。

于 2012-06-10T21:01:37.273 に答える
0

どんな答えも非常に主観的ですが_unitOfWork、ビューモデル内に参照(または注入が必要な依存関係)を含めることは、関心の分離をかなり激しくすることをお勧めします。

それをコントローラーに保管してください-はるかにきれいです。

于 2012-06-10T21:04:02.683 に答える