2010-09-14 4 views
8

tengo una vista parcial, que muestra una lista de objetos en un formato de tabla y permite la edición de los valores ...mvc.net cómo utilizar ayudantes inflexible mientras iteración a través de la lista

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %> 

<% foreach (whoozit.Models.PictureModel p in Model) 
      { %> 

    <td> 
    <%: Html.TextBox("name",p.name) %> 
    <%: Html.ValidationMessage(p.name) %> 
    </td> 

<% } %> 

estoy que quiere refactorizar esto para aprovechar los helpers html fuertemente tipados en mvc2. Me encuentro con dificultades para entender cómo crear las expresiones lambda y esperaba algo de ayuda. lo siguiente no me parece correcto.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %> 

<% foreach (whoozit.Models.PictureModel p in Model) 
      { %> 

    <td> 
    <%: Html.TextBoxFor(???) %> 
    </td> 

<% } %> 

Respuesta

8

Primero de todo lo que no se debe iterando en una vista. La iteración significa bucles, los bucles significan C#/VB.NET, C#/VB.NET en una vista conduce al código de spaghetti.

Yo le recomendaría usar Editor Templates. De esta forma, no necesita escribir bucles en sus vistas. Agregue el siguiente archivo en ~/Views/Home/EditorTemplates/PictureModel.ascx:

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<whoozit.Models.PictureModel>" %> 
<td> 
    <%: Html.TextBoxFor(x => x.name) %> 
    <%: Html.ValidationMessageFor(x => x.name) %> 
</td> 

en cuenta que el parcial es ahora fuertemente tipado a whoozit.Models.PictureModel en lugar de IList<whoozit.Models.PictureModel>. Ahora todo lo que queda es incluir este parcial de la vista principal:

<%: Html.EditorFor(x => x.Pictures) %> 

Dónde Pictures es una propiedad de tipo IList<whoozit.Models.PictureModel> del modelo de la vista principal. Esto invocará automáticamente el parcial de cada elemento de la colección para que no tenga que escribir bucles feos en sus vistas.

Simplemente funciona por convención: el parcial debe llamarse PictureModel.ascx como el nombre de tipo de los elementos de lista y ubicado en la carpeta ~/Views/Home/EditorTemplates o ~/Views/Shared/EditorTemplates.

Las plantillas Editor/Pantalla harán que sus vistas sean mucho más elegantes.

Observación: En .NET, la convención es nombres de propiedades para comenzar con letra mayúscula, por lo que le recomendaría cambiar el nombre de la propiedad name al Name. Se siente más natural para escribir y leer:

<%: Html.TextBoxFor(x => x.Name) %> 
1
<%= Html.TextBoxFor(p => p.name) %> 
+0

esto da un error de 'IList no contiene una definición de nombre ...'la variable' p 'es del tipo List y no de Picture, por lo que no puedo acceder al campo de nombre – yamspog

1

Usted está diciendo a su vista parcial esperar una lista de elementos whoozit.Models.PictureModel. Entonces su foreach está buscando whoozit.Models.Picture not PictureModel. A continuación se muestra cómo normalmente haría algo como esto. Asegúrese de que su Lista sobre la que trata de enumerar sea del tipo correcto. Si la clase de imagen proviene de una colección dentro de PictureModel, asegúrese de estar haciendo Model. Lo que sea en el foreach.

Prueba esto:

<% foreach(var p in Model) { %> 
<td> 
<%: Html.TextBoxFor(p => p.name) %> 
<%: Html.ValidateFor(p => p.name) %> 
</td> 
<% } %> 
2

Puede utilizar métodos auxiliares inflexible haciendo un bucle a través del modelo con un bucle. Esto también hará que el atributo html "name" sea único, por lo que la carpeta de modelo puede ayudarlo a volver a asignar los valores a su modelo en una situación de guardado.

<% for (int i = 0; i < Model.Count; i++) { %> 

    <%: Html.TextBoxFor(m => m[i].Name) %> 
    <%: Html.TextBoxFor(m => m[i].SomethingElse) %> 

<% } %> 

Leer más aquí .. http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

Cuestiones relacionadas