2010-08-05 15 views
31

Soy cariñosa MVC 2. Todo esto se adapta muy bien a la web.¿Cómo puedo usar Html.DisplayFor dentro de un iterador?

Hay una pieza de funcionalidad, sin embargo, que no soy capaz de convencer a cabo la función de Html.DisplayFor():

<@ Page Inherits="ViewPage<IEnumerable<Foo>>"> 

<% foreach(var item in Model) { %> 

    <%: Html.DisplayFor(item.BarBaz) %> 

<% } %> 

necesito para poder utilizar el DisplayTemplate para este valor. ¿Hay alguna forma de hacer esto?

Respuesta

63

En realidad, lo descubrí. Que estúpido de mi parte.

Esto funciona:

<@ Page Inherits="ViewPage<IEnumerable<Foo>>"> 

<% foreach(var item in Model) { %> 

    <%: Html.DisplayFor(m => item.BarBaz) %> 

<% } %> 
+2

Creo que soy aún más estúpido, ya que no estoy seguro de cómo interpretar esto. El parámetro formal lambda m no se usa en la expresión. Entonces, ¿esto solo está allí porque lo requiere _DisplayFor_? Además, esperaba que '@ Html.Display (item.BarBaz)' funcionaría igual de bien, pero eso no representa nada. –

+0

@ R.Schreurs Parece que la lambda necesita ser una expresión 'Func' que toma el tipo del modelo como parámetro, pero puede devolver cualquier cosa. – JohnnyHK

+0

Soy estúpido también :) –

10

que se pueden realizar por alejarse del foreach y utilizando un habitual para el bucle:

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

    <%: Html.DisplayFor(p=> p.ElementAt(i).BarBaz) %> 

<%} %> 

Otra opción sería la creación de un PartialView que tuvo un objeto Foo y sólo está representada la información que quería.

<% foreach (var item in Model) 
    { 
     Html.RenderPartial("FooBarBazLine", item); 
    } %> 
+1

me gusta la opción 2 mejor – Necros

+1

1, pero estoy con Necros/opción 2 es mucho más limpio – Tahbaza

+1

Acepto que la opción 2 es una mejor solución. Acabo de incluir la opción 1 porque primero pensé en ella y no tenía ningún motivo para eliminarla, ya que soluciona el problema. – sgriffinusa

3

Html.DisplayFor puede repetir automáticamente a través de colecciones, que muestra una vista parcial para cada elemento de la colección.

Lo primero que debe hacer es crear una clase de modelo real, siendo la colección una propiedad de la clase.

public class Bar 
{ 
    public IEnumerable<Foo> foo { get; set; } 
} 

Devuelva esta clase desde su controlador en lugar de la colección sin procesar.

En segundo lugar, necesita una plantilla de pantalla para la clase Foo. Las plantillas de visualización son vistas parciales que deben colocarse en la carpeta Views/Shared/DisplayTemplates.

Editar: Puede tenerlos en su subcarpeta de controladores de Vistas también si desea limitar la plantilla a un controlador en particular. Consulte this question para obtener más información.

Aquí se muestra un ejemplo de la sintaxis de la maquinilla de afeitar:

@model YourNameSpace.Foo 
<p>@Model.BarBaz</p> 

Guardar como Foo.cshtml en el DisplayTemplates carpeta dada anteriormente.

Esta plantilla es bastante simple porque se basa en su ejemplo en el que solo muestra una cadena, pero si los elementos de la colección son una clase con sus propias propiedades, podría crear una plantilla más elaborada.

Ahora en la vista original, usted puede deshacerse del bucle completo y acaba de escribir

@Html.DisplayFor(m => m.foo) 

Aviso foo es el nombre de la propiedad en su nueva clase de modelos que contiene la colección de edad que en loop antes .

DisplayFor sabrá automáticamente que la propiedad es de tipo foo (colección de) Foo y recoger la plantilla en la carpeta Foo.cshtmlDisplayTemplates y mostrar una vez para cada elemento de foo.

+0

Imagina que tienes toneladas de modelos, con listas como esta ** IEnumerable **. ¿Vas a crear una plantilla por cada una de las mil entidades? Todo lo que necesita es solo una plantilla genérica para tipos básicos, como cadena, entero, booleano, etc. – Alexander

+0

Realmente no necesita barra, ¿en caso de que la colección foo sea accesible, digamos, estáticamente? ¿O solo es una variable local? – toddmo

6

Ésta es una vieja pregunta, pero supongo que alguien pueda obtener beneficios de mi solución:

vista Aspx

<%@ Page Inherits="ViewPage<IEnumerable<Foo>>" %> 

<% foreach (var item in Model) { %> 

    <%: Html.DisplayFor(m => item) %> 

<% } %> 

vista Razor

@model IEnumerable<Foo> 

@foreach (var item in Model) 
{ 
    Html.DisplayFor(m => item) 
} 

Desde DisplayFor acepta un lambda tipeado implícito, podemos indicar directamente la instancia e para mostrar en el bucle.

Por último, he de acuerdo con la respuesta Anders E. Andersen 's para el uso de la plantilla

0

En Razor estoy usando

@Html.DisplayFor(model => item.CreatedDate) 
Cuestiones relacionadas