【问题标题】:ASP.NET MVC: Cannot use a lambda expression as an argument to a dynamically dispatched operationASP.NET MVC:不能将 lambda 表达式用作动态分派操作的参数
【发布时间】:2013-06-09 15:14:09
【问题描述】:

我有一个 ASP.NET MVC4 应用程序。 我的视图从我的控制器获得一个列表。 我想用 lambda 表达式选择这些列表,但出现以下错误:

如果不先将 lambda 表达式转换为委托或表达式树类型,则不能将其用作动态分派操作的参数

List<project.Models.LAYER> layers = new List<project.Models.LAYER>();
layers = @Model.layers.Select(x => x.KONT == "EUROPE");

@Model.layers 是一个列表

现在我尝试了:但同样的错误:

@{
  List<project.Models.LAYER> layers = Model.layers.Where(x => x.KNOT == "EUROPE").ToList();
}

【问题讨论】:

  • 你确定这段代码可以编译吗?您不需要这里的 @ 符号,它会从 HTML 切换到 C# 表达式(并返回到表达式的末尾)。但是您提取的代码是纯 C#(无需切换)。此外,你为什么给layers分配一个新的空列表并立即为其分配另一个值?
  • Model.layers 是一个什么样的列表?是List&lt;project.Models.LAYER&gt;吗?可能不是因为错误消息表明某处涉及动态类型。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

在您看来,您这样做似乎违反了关注点分离的原则。但这就是你的做法。

@
{
   var layers = Model.layers.Where(x => x.KONT == "EUROPE").ToList();
}

@foreach(var layer in layers)
{
  .....
}

更好的方法

您应该做的是在您的模型“GetLayersForLocation”上创建一个方法然后您的代码将如下所示:

在您的模型类中

public IEnumerable<Layer> GetLayersForLocation(string location)
{
    return this.layers.Where(x => x.Knot == location);
}

在您的代码中

@foreach(var layer in Model.GetLayersForLocation("EUROPE"))
{
  .....
}

这样做更好的原因是您现在可以对您的代码进行单元测试,因为这只是您视图的一部分,而您现在不能这样做,但现在您可以运行自动化测试以确保获得正确的层正常工作。

【讨论】:

    【解决方案2】:

    对于其他人,我注意到当我没有强类型视图时,我会在视图中收到此错误,例如,如果在“@model”之前意外输入了单个字符type" 行(因此现在不再进行模型类型声明。)

     @model SomeModel
    

    【讨论】:

      【解决方案3】:
      1. layers 是一个 List,Model.layers.Select 会返回一个IEnumerable.

      2. 如果你只想返回KONT == ‘EUROPE'的层,你应该像下面这样使用

        layers = @Model.layers.Where(x => x.KNOT == "EUROPE").ToList();
        

      【讨论】:

      • 感谢您的回答:我现在试过了:@{ List layers = new List();层 = @Model.layers.Where(x => x.KNOT == "EUROPE").ToList(); } 但是还是有同样的错误。
      猜你喜欢
      • 1970-01-01
      • 2017-09-18
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      相关资源
      最近更新 更多