2011-08-29 18 views
5

estoy usando Código de Entity Framework En primer lugar a mi base de datos generada, así que tengo un objeto definido como la siguiente:Usando ASP.NET MVC 3 con Razor, ¿cuál es la forma más efectiva de agregar una ICollection a una vista Crear?

public class Band 
{ 
    public int Id { get; set; } 
    [Required(ErrorMessage = "You must enter a name of this band.")] 
    public string Name { get; set; } 
    // ... 
    public virtual ICollection<Genre> Genres { get; set; } 
} 

Ahora estoy viendo una vista crear para esto y el andamio por defecto no es añadiendo Géneros a mi forma, que por experiencia pasada es más o menos lo que espero.

Buscando en línea He encontrado Using ASP.NET MVC v2 EditorFor and DisplayFor with IEnumerable<T> Generic types que parece estar más cerca de lo que quiero, pero no parece tener sentido con Razor y posiblemente MVC 3, por ASP.NET MVC 3 Custom Display Template With UIHint - For Loop Required?.

En la actualidad he añadido la lista de géneros a la ViewBag y a continuación, recorrer ese listado crear en mi punto de vista:

@{ 
    List<Genre> genreList = ViewBag.Genres as List<Genre>; 
} 
// ... 
<ul> 
@for (int i = 0; i < genreList.Count; i++) 
{ 
    <li><input type="checkbox" name="Genres" id="[email protected](i.ToString())" value="@genreList[i].Name" /> @Html.Label("Genre" + i.ToString(), genreList[i].Name)</li> 
} 
</ul> 

Fuera de los casos aún no se manejan en el que el usuario tiene JavaScript desactivado y las casillas de verificación Es necesario volver a verificar y, en realidad, actualizar la base de datos con esta información, muestra los géneros como me gustaría.

Pero esto no se siente bien, basado en lo bueno que se ha convertido MVC 3.

Entonces, ¿cuál es la forma más efectiva de manejar esto en MVC 3?

Respuesta

5

No envío listas a mi Vista a través de ViewBag, en cambio uso mi viewmodel para hacer esto. Por ejemplo, hice algo como esto:

Tengo una EditorTemplate así:

@model IceCream.ViewModels.Toppings.ToppingsViewModel 
<div> 
    @Html.HiddenFor(x => x.Id) 
    @Html.TextBoxFor(x =x> x.Name, new { @readonly="readonly"}) 
    @Html.CheckBoxFor(x => x.IsChecked) 
</div> 

que puse en mis vistas de carpeta \ IceCream \ EditorTemplates. Utilizo esto para mostrar algunos html para permitir al usuario "verificar" cualquier encabezado en particular.

Luego, en mi punto de vista Tengo algo como esto:

@HtmlEditorFor(model => model.Toppings) 

y que utilizará ese resultado en mi EditorTemplate siendo utilizado para cada uno de los ingredientes en la propiedad coberturas de mi modelo de vista.

Y luego tengo un modelo de vista que, entre otras cosas, incluye la colección Ingredientes:

public IEnumerable<ToppingsViewModel> Toppings { get; set; } 

otra vez en mi controlador, entre otras cosas, recuperar los ingredientes (sin embargo yo que en mi caso) y establecer la propiedad de mi viewmodel a esa colección de toppings. En el caso de un Edit, donde los toppings pueden haber sido seleccionados previamente, configuro el miembro IsChecked del TopingsViewModel y establecerá las casillas de verificación correspondientes para que se marquen.

Haciéndolo de esta manera proporcionó el modelo correcto de encuadernación de modo que cuando el usuario verificó algunas coberturas, los elementos subyacentes en la colección reflejaron esas selecciones. Me funcionó bien, espero que sea útil para ti.

+0

Lo sentimos, todavía estamos tratando de encontrar tiempo para implementar esto. Pero vale la pena señalar su pregunta http://stackoverflow.com/q/7155747/11912 que agrega contexto adicional a su respuesta. –

Cuestiones relacionadas