2011-03-30 11 views
6

Nuevo en ASP.NET MVC (usando MVC3 con Razor ahora) y estoy confundido al pasar un objeto del Controlador a la Vista. Específicamente, estoy experimentando con MVC3 y Massive (http://blog.wekeroad.com/helpy-stuff/and-i-shall-call-it-massive) de Rob Conery. Estoy jugando con un blog como una aplicación web simple para experimentar.Pase la lista masiva a Ver en MVC3

HomeController.cs:

public ActionResult Index() 
     { 
      var table = new DynamicModel("mydb", tableName: "Posts"); 
      //grab all the posts 
      var posts = table.All(); 
      ViewData["Posts"] = posts; 

      return View(); 
     } 

Esta parte funciona muy bien. ¿Pero cómo hago esto?

return View(posts); 

Si me refiero a @posts.PostID en la vista, él los errores hacia fuera y dice que no es válido. Así que traté de crear una vista fuertemente tipada contra DynamicModel, pero posts todavía no estaba allí.

Sé que puedo crear un ViewModel y escribir la vista en contra de eso y conectar mis datos allí. Se trata más de entender cómo interactúan el Controlador/Vista.

Gracias!

Respuesta

2

ASP NET MVC Templates es la solución.

En primer lugar, se desaconseja usar ViewData, especialmente ahora en MVC 2.0 y 3.0 donde hay muchas formas mejores de pasar el estado a la vista.

La vista fuertemente tipada es el camino a seguir. Pero, ¿qué pasa si tienes una colección para aprobar? Bueno, aún puede crear una vista fuertemente tipada para la colección (o lista genérica) pero la solución estándar es usar plantillas ASP NET MVC (que son archivos ascx) para el elemento y no la colección y llamar a RenderPartial en su vista principal:

Por ejemplo:

 <div> 
      <% for (int i = 0; i < Model.Bars.Count; i++) 
       {%> 
      <h3> 
       <a href="#">Bar 
        <%: String.Format("{0:g}", Model.Bars[i].DocumentDate.ToShortDateString())%></a></h3> 
      <div> 
       <%: Html.DisplayFor(m => m.Bars[i].Content)%> 
      </div> 
      <%}%> 
     </div> 

hay una muy buena serie sobre este tema here.

+0

Lo suficiente, pero ¿cómo paso el objeto 'posts' a la vista parcial? Creé una vista fuertemente tipada y falló ... –

+0

Usted no acaba de decir 'DisplayFor' o' EditorFor' – Aliostad

+0

Creé una vista fuertemente tipada contra el objeto DynamicModel de Massive. También lo probé contra mi objeto MVC.Models.Posts. Luego ejecuté 'return View (posts);' e intenté hacer referencia a 'posts' en View. Bombardeó, diciendo que 'publicaciones' no existe. ¿Qué tienen que ver 'DisplayFor' y' EditorFor' con eso? ¡Estoy totalmente confundido! –

10

Primero que nada necesitas crear una clase. Por ejemplo:

public class Post : DynamicModel 
{ 
    public Post(): base("db") 
    { 
     PrimaryKeyField = "PostID"; 
    } 

} 

En el controlador se puede tener:

public ActionResult Index() 
     { 
      var table = new Post(); 
      var posts = table.All(); 

      return View(posts); 
     } 

Así que usted puede crear una vista de tipo firme y establecer el modelo de la vista a IEnumerable. La vista será así:

@model IEnumerable<dynamic> 

<h2>Index</h2> 
<ul> 
@foreach (var item in Model) 
{ 
    <li>@item.PostID</li> 
} 
</ul> 
+0

Gracias GeoChatz! No sabía sobre IEnumerable . – Leonardo

Cuestiones relacionadas