2010-06-17 24 views
5

He estado buscando modelos de vista para mvc y estoy buscando la mejor manera de hacerlo. He leído muchos artículos diferentes, pero ninguno parece estar claro como la "mejor manera". Hasta ahora ejemplo que podría tener un modelo de atención al cliente con las siguientes propiedades:asp.net mvc viewmodels. Cuánta lógica (si hay alguna) deberían contener

  • Nombre
  • Apellido
  • Título
  • Ubicación

donde la ubicación es una clave externa a una ubicación tabla en la base de datos.

Quiero poder editar este cliente, pero solo el nombre, el apellido y la ubicación. No me molesta el título en la edición. Entonces, en mi opinión, tendré que pasar a un cliente y una lista seleccionada.

Ahora, por lo que he leído, tengo las siguientes opciones (probablemente haya muchas más).

Así que mi pregunta es, básicamente, ¿cuál es la mejor?

1)

Añadir una lista de selección a la ViewData["Location"] y simplemente crear una vista inflexible de tipos de cliente?

2)

crear un modelo de vista en la que pase un cliente y seleccione lista (el acceso a los datos se realiza en el controlador):

public class ViewModelTest 
{ 
    public Customer Customer { get; set; } 
    public SelectList Locations { get; set; } 

    public ViewModelTest(Customer customer, SelectList locations) 
    { 
     Customer = customer; 
     Locations = locations; 
    } 
} 

3)

crear un modelo de vista donde paso un cliente y una lista de ubicaciones y creo la lista de selección en el modelo de vista.

public class ViewModelTest 
{ 
    public Customer Customer { get; set; } 
    public SelectList Locations { get; set; } 

    public ViewModelTest(Customer customer, List<Location> locations, string selectedLocation) 
    { 
     Customer = customer; 
     Locations = new SelectList(locations, "LocationID", "LocationName", selectedLocation); 
    } 
} 

4)

pasa un cliente y el repositorio y hacer el acceso a los datos en el modelo de vista.

public class ViewModelTest 
{ 
    public Customer Customer { get; set; } 
    public SelectList Locations { get; set; } 

    public ViewModelTest(Customer customer, IRepository repository, string selectedLocation) 
    { 
     Customer = customer; 
     Locations = new SelectList(repository.GetLocations(), "LocationID", "LocationName", selectedLocation); 
    } 
} 

5)

crear el modelo de la vista con sólo las propiedades que necesito:

public class ViewModelTest 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public SelectList Locations { get; set; } 

    public ViewModelTest(Customer customer, SelectList locations) 
    { 
     FirstName = customer.FirstName; 
     LastName = customer.LastName ; 
     Locations = locations; 
    } 
} 

6)

o alguna otra combinación de los anteriores u otra manera.

Todas las opiniones son bienvenidas.

Respuesta

6

Esto es lo que puedo sugerir: tiene un modelo de vista que refleja los campos de visión inflexible:

public class SomeViewModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Location { get; set; } 
    public IEnumerable<SelectListItem> PossibleLocations { get; set; } 
} 

Y en su acción de controlador pueblan este modelo de vista:

public ActionResult Index() 
{ 
    var customer = Repository.GetCustomer(); 
    var locations = Repository.GetLocations(); 
    var viewModel = new SomeViewModel 
    { 
     FirstName = customer.FirstName, 
     LastName = customer.LastName, 
     Location = customer.Location, 
     PossibleLocations = new SelectList(locations, "LocationID", "LocationName", customer.Location); 
    }; 
    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Index(SomeViewModel viewModel) 
{ 
    // TODO: Handle the form submission 
    return View(viewModel); 
} 

Por supuesto haciendo el mapeo entre el modelo y el modelo de vista de forma manual, como se muestra en mi ejemplo, podría volverse bastante engorroso y, en este caso, le recomendaría que consulte AutoMapper.

2

Tendría mi modelo de vista, ya que

public class SomeViewModel 
{ 
    public Customer Customer { get; set; } 
    public IEnumerable<Location> PossibleLocations { get; set; } 
} 

Mi controlador de la siguiente manera:

public ActionResult Index() 
{  
    var viewModel = new SomeViewModel 
    { 
     Customer = Repository.GetCustomer(), 
     PossibleLocations = Repository.GetLocations() 
    }; 
    return View(viewModel); 
} 

y luego se puede acceder a todo el objeto al cliente en la vista de la siguiente manera:

Customer name - <%: Model.Customer.FirstName %> <%: Model.Customer.LastName %> 
Location - <%: Html.DropDownList("LocationID", new SelectList(Model.PossibleLocations as IEnumerable, "LocationID", "LocationName", Model.Location.LocationID))%> 
Cuestiones relacionadas