2012-06-10 41 views
6

Tengo una aplicación MVC donde quiero mostrar una lista desplegable con información de la base de datos.MVC donde debería ir la lógica Controlador o el Modelo de Vista

El menú desplegable mostrará la información de la base de datos Automóviles que usan la mesa Marca cuál es la marca del automóvil.

Así que en mi opinión voy a tener algo como:

@model VectorCheck.ViewModels.CarsViewModel 
... 

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

Así que de alguna manera me necesita para obtener el modelo de vista la lista de marcas.

Así que podría tener un poco de lógica para este decir solo autos que son de color rojo.

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

Así que mi pregunta es dónde es la mejor práctica para poner la lógica para esta consulta. Debería ir en viewModel o controlador.

De la manera en que lo veo, tengo dos opciones.

Opción 1: El controlador.

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

modelo de vista

public Car Car { get; set; } 
public IEnumerable<SelectListItem> CarMakes { get; set; } 

InsertUpdateCarViewModel(Car car, IEnumerable<SelectListItem> carMakes) 
{ 
    Car= car; 
    CarMakes = carMakes; 

} 

Así que en este ejemplo que reciben los carMakes en el controlador y los dará al modelo de vista que es simplemente un contenedor.

Opón 2: El modelo de vista

public ActionResult Edit(int id) 
     { 
      var car = _unitOfWork.CarRepository.Get(id); 

      return View("Edit", new InsertUpdateCarViewModel(car)); 
     } 

modelo de vista

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

} 

Así que en esta opción Estoy poniendo la lógica para obtener los carmakes correctas en el modelo de vista. Es más que un contenedor.

Entonces, ¿qué es lo que quiero saber es cuál de estas formas es la forma correcta de hacerlo?

Respuesta

3

En el controlador. ViewModel no debe conocer la unidad de trabajo que está utilizando. Además, el modelo de vista en este caso sería mucho más reutilizable si no tuviera que depender de la lógica x => x.Colour == "Red". A pesar de que esto podría trasladarse a los argumentos, en general, creo que sus modelos (y por lo tanto las vistas) serían mucho más reutilizables y se encargarían de eso en el controlador.

0

Debe agregar su lógica al controlador. En MVC, ViewModel es un objeto que contiene propiedades utilizadas en su vista, sin lógica de negocios allí.

0

Cualquier respuesta sería muy subjetiva, pero yo sugeriría que tener la referencia _unitOfWork (o cualquier dependencia que necesite inyectar) dentro de su modelo de vista bastante violenta separación de preocupaciones.

Guárdelo en el controlador - mucho más limpio.

3

Como ya se respondió, es el controlador. Para que sea más memorable para usted, lo pondría de esta manera. No permita que su vista hable directamente con la base de datos. La vista pregunta/habla SOLAMENTE con el controlador. Entonces, obviamente, tiene sentido que la vista envíe una solicitud al controlador que la reenvía a la base de datos. Espero que esto ayude para el futuro!

Cuestiones relacionadas