razor view with anonymous type model class. It is possible?

nosbor picture nosbor · Jul 7, 2011 · Viewed 26.2k times · Source

I want to create a view using razor template, but I do not want to write a class for model, because in many views i will have many queries which will be returning diferent models.

For example I have a linq query:

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 */
};

I need to write a View for this query. This query returns a Articles.

Now I dont know how should looks like a model definition.

I tried to use this deffinition:

@model System.Collections.IEnumerable

But then I had an erros than fileds doesnt exists in object type:

*CS1061: 'object' does not contain a definition for 'addition_field' and no extension method 'addition_field' accepting a first argument of type 'object' could be found*

This is my model for which I do not want to write a next model. Of course

Answer

Brook picture Brook · Jul 7, 2011

The short answer is that using anonymous types is not supported, however, there is a workaround, you can use an ExpandoObject

Set your model to @model IEnumerable<dynamic>

Then in the controller

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;
    }
}