ASP.NET MVC ViewBag匿名类列表在Count()方法上抛出错误

Can*_*ğlu 5 c# asp.net-mvc anonymous-types razor asp.net-mvc-4

我有一个服务器端代码,我从数据库返回一个匿名类列表:

    public ActionResult DisplayMap()
    {
        ViewBag.Checkins = (from locationUpdate in db.LocationUpdates
                            select new
                            {
                                locationUpdate,
                                locationUpdate.User
                            }).ToList();
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

在Razor页面,我想得到这个列表的计数:

@if (ViewBag.Checkins.Count() > 0)
{ ... }
Run Code Online (Sandbox Code Playgroud)

但是,它会抛出一个错误:

An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred 
in System.Core.dll but was not handled in user code.

Additional information: 'object' does not contain a definition for 'Count'
Run Code Online (Sandbox Code Playgroud)

当我输入ViewBag.Checkins即时窗口时,我得到:

ViewBag.Checkins
{System.Collections.Generic.List<<>f__AnonymousType6<MY_APP.LocationUpdate,MY_APP.User>>}
    [0]: { locationUpdate = {System.Data.Entity.DynamicProxies.LocationUpdate_4532566693B61EF657DDFF4186F1D6802EA1AC8D5267ED245EB95FEDC596E129}, User = {System.Data.Entity.DynamicProxies.User_816C8A417B45FE8609CD1F0076A5E6ECBAB0F309D83D2F8A7119044B1C6060CF} }
Run Code Online (Sandbox Code Playgroud)

该Checkins物体的确是List,数据是正确的.我试过Count,Length太(没有方法调用,就像属性),但没有运气.我究竟做错了什么?

D S*_*ley 25

ViewBag是dynamic,虽然Count是一个扩展方法,它不是动态支持的(它必须在编译时绑定).

您可以强制转换为an IEnumerable<dynamic>,也可以直接使用static方法:

@if (((IEnumerable<dynamic>)ViewBag.Checkins).Count() > 0)
Run Code Online (Sandbox Code Playgroud)

要么

@if (Enumerable.Count(ViewBag.Checkins) > 0)
Run Code Online (Sandbox Code Playgroud)

或者创建一个带有Checkins属性的强类型模型,并ViewBag完全避免.

编辑

由于您只是想检查计数是否大于0,Any因此更合适(并且可能会节省一些处理时间,具体取决于方案):

@if (Enumerable.Any(ViewBag.Checkins))
Run Code Online (Sandbox Code Playgroud)

  • 这是一个可靠的答案.忘记了不支持动态绑定的扩展方法."Enumerable.Count"工作了,谢谢. (2认同)