【问题标题】:ASP.NET MVC 2/.NET 4/Razor - Can't use Any() extension method on a ViewModel memberASP.NET MVC 2/.NET 4/Razor - 不能在 ViewModel 成员上使用 Any() 扩展方法
【发布时间】:2010-08-20 21:29:24
【问题描述】:

我正在试用 ASP.NET MVC 3 Preview 1 中的 Razor ViewEngine,但在尝试使用 Any() 扩展方法时遇到了问题。

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

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

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

@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 命名空间添加到 web.config 的 pages\namespaces 部分,并在视图顶部添加 @using System.Linq 行,但两者都没有任何区别。我需要做什么才能访问 LINQ 扩展方法?

更新:看起来它与它是动态对象的属性有关 - 如果我手动将其转换为 IList&lt;T&gt;,它就可以工作。

【问题讨论】:

  • 呸,我刚刚看了你的更新......哦,好吧
  • 我在使用动态“视图”时遇到了问题。在某些情况下,我恢复到 ViewData[]。

标签: linq .net-4.0 extension-methods razor asp.net-mvc-3


【解决方案1】:

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

我推荐以下之一:

  1. 使用强类型视图。这样一来,您还可以在 Visual Studio 中获得完整的 Intellisense(一旦受支持)。

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

【讨论】:

  • 这真的很有趣,而且现在很有意义......我认为我仍然认为动态不仅仅是var。感谢那。 :)
【解决方案2】:

这似乎是动态 View 属性的错误。如果您将 @if 语句更改为类似

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

您会发现它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多