2011-07-07 21 views
18

Quiero crear una vista usando una plantilla de afeitar, pero no quiero escribir una clase para el modelo, porque en muchas vistas tendré muchas consultas que me devolverán diferentes modelos.vista de maquinilla de afeitar con clase de modelo de tipo anónimo. ¿Es posible?

Por ejemplo, tengo una consulta LINQ:

from p in db.Articles.Where(p => p.user_id == 2) 
select new 
{ 
    p.article_id, 
    p.title, 
    p.date, 
    p.category, 
    /* Additional parameters which arent in Article model */ 
}; 

Tengo que escribir una vista para esta consulta. Esta consulta devuelve un artículo.

Ahora no sé cómo debería verse una definición de modelo.

I tratado de utilizar este deffinition:

@model System.Collections.IEnumerable 

Pero luego tuve un erros de campos campos doesnt existe en el tipo de objeto:

* CS1061: 'objeto' no contiene una definición para 'addition_field 'y no se pudo encontrar ningún método de extensión' addition_field 'que aceptara un primer argumento de tipo' objeto '*

Este es mi modelo para el que no quiero escribir un próximo modelo. Por supuesto

+0

'' @Model System.Collections.IEnumerable

+0

Esa consulta parece proyectar una 'IEnumerable' de tipos anónimos, no de' Article' –

+0

¿Puedes explicarme más por qué no quieres escribir un modelo? El uso de clases modelo presenta ventajas, p. Ej. puede usar intellisense, puede hacer un mayor uso de las clases parciales y puede agregar atributos para cosas como la validación de las clases modelo. – Stuart

Respuesta

39

La respuesta corta es que using anonymous types is not supported, sin embargo, there is a workaround, se puede usar un ExpandoObject

Indica tu modelo para @model IEnumerable<dynamic>

Luego, en el controlador

from p in db.Articles.Where(p => p.user_id == 2) 
select new 
{ 
    p.article_id, 
    p.title, 
    p.date, 
    p.category, 
    /* Additional parameters which arent in Article model */ 
}.ToExpando(); 

... 
public static class Extensions 
{ 
    public static ExpandoObject ToExpando(this object anonymousObject) 
    { 
     IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject); 
     IDictionary<string, object> expando = new ExpandoObject(); 
     foreach (var item in anonymousDictionary) 
      expando.Add(item); 
     return (ExpandoObject)expando; 
    } 
} 
+0

muchas gracias :) – nosbor

+0

1 me gustaría poder upvote esto más de una vez. 'ToExpando' es una gran idea! –

1

Parece que no puede pasar tipos anónimos, pero si solo desea los valores del tipo, puede pasar un enumerable de una matriz de objetos para ver.

Vista:

@model IEnumerable<object[]> 

@{ 
    ViewBag.Title = "Home Page"; 
} 

<div> 
    <table> 
     @foreach (var item in Model) 
     { 
      <tr> 
       <td>@item[0].ToString()</td> 
       <td>@item[1].ToString()</td> 
      </tr> 
     } 
    </table> 
</div> 

controlador:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Mvc; 

    namespace ZZZZZ 
    { 
     public class HomeController : Controller 
     { 
      public ActionResult Index() 
      { 

       List<object[]> list = new List<object[]> { new object[] { "test1", DateTime.Now, -12.3 } }; 

       return View(list); 
      } 


     } 

    } 
+0

Nada mal :-) – netfed

Cuestiones relacionadas