8

Deseo construir una vista parcial que obtenga una columna modelo e imprimirla. Algo así:asp.net mvc - pase el modelo de datos parciales a la vista parcial

A la vista:

@model IEnumerable<products_comparison.Models.Product> 
@{ 
ViewBag.Title = "Index"; 

var Brand = (from r in Model 
      select r.Brand).Distinct(); 
} 
<h2> 
Index</h2> 

@Html.RenderPartial("_DisplayAttribute",Brand) 

Y a la vista parcial:

<table> 
    <tr> 
     <th> 
      Brand 
     </th> 
    </tr> 
    @foreach (var row in Model) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(r => row) 
      </td> 
     </tr> 
    } 
</table> 

Hay algunos problemas que me encuentro:

  1. El compilador no me permite enviar a Barnd a la vista parcial.
  2. Si mira el código de vista parcial, verá la palabra Marca, que es el nombre de la columna. No deseo codificar la palabra "Marca" en la vista parcial, prefiero que el nombre de la columna esté allí.
  3. En la vista parcial necesito poner @model products_comparison.Models.Product, pero no quiero querer enviar la tabla de agujeros. Quiero enviar solo una columna - Pero no sé qué poner allí ...

¡Gracias!

EDIT:

Sólo para aclarar una cosa, quiero que la vista se llame a la misma vista parcial para cada columna de la tabla (para la mayoría de las columnas en la tabla de todos modos) y cada vez que voy a envíe una columna diferente (columna de valor distintivo para ser exactos).

Respuesta

7

Para intente cambiar @Html.RenderPartial("_DisplayAttribute",Brand) a @Html.Partial("_DisplayAttribute",Brand)

También tendrá que especificar el modelo en la vista parcial como @model products_comparison.Models.Brand o algo parecido

También por favor aclarar 2 & 3, ya que no son claras lo que quiere

+0

Su respuesta a 1 arreglaron .. Y yo editar mi pregunta .. – Nir

+0

Gracias! Tu respuesta es genial! –

+0

@Nir Normalmente es útil si 'Acepta' la respuesta que lo ayudó. (Por favor y gracias.) –

12

Comience por refactorizar y poner la lógica correcta en el lugar correcto. Esta consulta LINQ no tiene estrictamente nada que ver en una vista. No se supone que una vista haga ninguna consulta LINQ o lo que sea para extraer datos. Se supone que una vista funciona con los datos que se le pasan desde la acción del controlador bajo la forma de un modelo de vista. Una acción de controlador crea y pasa un modelo de vista adaptada que defina para la vista.

Así que como siempre se empieza por la definición de un modelo de vista que se adaptará a los requerimientos de su vista:

public class MyViewModel 
{ 
    public IEnumerable<Brand> Brands { get; set; } 
} 

continuación, se escribe una acción del controlador que pueblan este modelo de vista y pasarlo a la vista :

public ActionResult Foo() 
{ 
    IEnumerable<products_comparison.Models.Product> products = ... 
    var model = new MyViewModel 
    { 
     Brands = (from r in Model select r.Brand).Distinct() 
    }; 
    return View(model); 
} 

luego un punto de vista:

@model MyViewModel 
<table> 
    <tr> 
     <th> 
      Brand 
     </th> 
    </tr> 
    @Html.DisplayFor(x => x.Brands) 
</table> 

y finalmente COU LD definir una plantilla de visualización correspondiente, que automáticamente se procesa para cada elemento de la colección Brands de su modelo de vista (~/Views/Shared/DisplayTemplates/Brand.cshtml):

@model Brand 
<tr> 
    <td> 
     @Html.DisplayForModel() 
    </td> 
</tr> 
+0

Gracias. Mi problema con su respuesta es que ve la dirección a la columna de Marca y no a una columna. Quiero que la vista llame a la misma vista parcial para cada columna en la tabla (para la mayoría de las columnas en la tabla). Por eso, no pasé solo la marca a la vista, sino que envié la mesa de los agujeros. – Nir

+0

@nir, en este caso podría adaptar su modelo de vista para que contenga las columnas y las filas de la tabla. –

+0

Entonces, ¿cómo se defiende del modelo en sí? – Nir

Cuestiones relacionadas