代码之家  ›  专栏  ›  技术社区  ›  Daniel Schaffer

ASP.NET MVC 2/.NET 4/Razor-不能对ViewModel成员使用任何()扩展方法

  •  4
  • Daniel Schaffer  · 技术社区  · 14 年前

    我正在尝试ASP.NET MVC 3预览1中的Razor ViewEngine,但在尝试使用 Any() 扩展方法。

    下面是我用来在控制器中设置属性的代码:

    ViewModel.Comparisons = DB.Comparisons.Where(c => c.UserID == this.UserID).ToArray();
    

    这是我尝试使用的视图中的代码 任意() :

    @if (!View.Comparisons.Any()) {
    <tr>
        <td>You haven't not started any comparisons yet. @Html.Action("Start a new comparison?", "create", "compare")</td>
    </tr>
    }
    

    我得到一个例外,说:

    'System.Array' does not contain a definition for 'Any'
    

    我已经尝试添加 System.Linq 命名空间到 pages\namespaces web.config的节,并添加 @using System.Linq 在视图顶部的线条,两者都没有区别。我需要做什么才能访问Linq扩展方法?

    更新: 看起来这与它是一个动态对象的属性有关-如果我手动将其强制转换为 IList<T> .

    2 回复  |  直到 14 年前
        1
  •  8
  •   Eilon    14 年前

    不幸的是,不能对声明为动态的值调用扩展方法。在这种情况下,ViewModel返回动态值,因此编译器不知道类型,因此找不到对扩展方法的调用。

    我建议您选择以下选项之一:

    1. 使用强类型视图。通过这种方式,您还可以在Visual Studio中获得完全的IntelliSense,一旦得到支持。

    2. 显式将值强制转换为ilist,然后调用扩展方法。这样编译器就可以进行正确的映射。

        2
  •  0
  •   Buildstarted    14 年前

    它似乎是带有动态视图属性的错误。如果你改变你的 @if 像这样的陈述

    @if(!(new List<string>().Any())) { }
    

    你会看到它起作用的。