Strange razor behavior with the <dynamic> list

This is my controller code:

 IQueryable<Foo> foos = dbContext.Foos.Where(...);

 return View(foos);

And this razor code (cshtml) works well :

@model IQueryable<Foo>

@{
     IQueryable<Foo> foos = Model;

     var projected = foos.Select(e => new 
     {
          fooId = e.FooId,
          bar = new 
          {
              barId = e.Foo.BarId
          }
     }).ToList();
}

@foreach (var x in projected)
{
     <span>@x.fooId</span><br />
}

But this razor code (cshtml) does not work, being almost the same:

@model IQueryable<Foo>

@{
     IQueryable<Foo> foos = Model;

     var projected = foos.Selected(Foo.Projection()).ToList()
}

@foreach (var x in projected)
{
     <span>@x.fooId</span><br />
}

Foo.Projection() is a static method that I reuse:

    public static Expression<Func<Foo, dynamic>> Projection()
    {
        return e => new
        {
            fooId = e.FooId,
            bar = new 
            {
                barId = e.Foo.BarId
            }
        }
    }

I get this famous error: 'object' does not contain definition for 'fooId'which is discussed here: The dynamic MVC Razor model, 'object' does not contain a definition for 'PropertyName' , but none of these answers helped me.

: ", MVC 3 , ", List<dynamic> ( " , " ), ( ). :

:

 List<dynamic> foos = dbContext.Foos.Select(Foo.Projection()).ToList();

 return View(foos);

:

 @model dynamic

 etc.




: ( ), "a definition for..." ( x, lot)

Debugger proof

+4
3

dynamic, . , , , - internal , .

, Razor, , , , . , , , .

, Razor. , dynamic, , .

, MVC Razor , . dynamic , , .

, , ExpandoObject .

+6

, View() contructor , , dynamic. :

List<dynamic> foos = dbContext.Foos.Select(Foo.Projection()).ToList();
ViewData.Model = foos; 
return View();

View, - ViewModel, IntelliSense?

View MVC 3, ViewBag, dynamic.

Controller:

List<dynamic> foos = dbContext.Foos.Select(Foo.Projection()).ToList();
ViewBag = foos; 
return View();

View:

@foreach (var x in ViewBag)
{
     <span>@x.fooId</span><br />
}
+1

   foos = dbContext.Foos.Select(Foo.Projection()). ToList();

 return View(foos);

@model List<dynamic>
0

All Articles