【发布时间】:2015-02-24 21:23:46
【问题描述】:
这是我的控制器的代码:
IQueryable<Foo> foos = dbContext.Foos.Where(...);
return View(foos);
这个剃须刀代码(cshtml)运行良好:
@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 />
}
但是这个剃须刀代码(cshtml)不起作用,几乎是一样的东西!:
@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() 是一个我经常复用的静态方法:
public static Expression<Func<Foo, dynamic>> Projection()
{
return e => new
{
fooId = e.FooId,
bar = new
{
barId = e.Foo.BarId
}
}
}
我遇到了那个著名的错误:'object' does not contain definition for 'fooId',在这里讨论:MVC Razor dynamic model, 'object' does not contain definition for 'PropertyName' - 但这些答案都没有帮助我。
接受的答案是:“现在 MVC 3 直接支持动态,不再需要下面的技术”,所以我也尝试将投影的 List<dynamic> 返回到视图( “准备使用,无需投影”)并且它也不起作用(得到相同的错误)。这是该尝试的代码:
控制器代码:
List<dynamic> foos = dbContext.Foos.Select(Foo.Projection()).ToList();
return View(foos);
查看代码:
@model dynamic
etc.
编辑:使用调试器,我可以检查(在抛出异常之后)该项目确实有"a definition for..."(在示例代码中,项目是x,但这里是lot)
【问题讨论】:
-
你在调试器中单步执行了吗?我很好奇
projected和x的类型是什么。 -
在调试器中单步执行。你能保证延迟执行不会杀死你吗? (即使您似乎在第二次尝试中实现了该列表..)
-
在调试模式下跳转错误时,我完全可以在foreach中查看所有“x”的内容。我可以验证
fooId是否存在(调试器能够读取它,即使错误告诉我该对象不包含它的定义......) -
我添加了调试器截图
标签: asp.net-mvc razor