ASP.NET MVC:不能将lambda表达式用作动态分派操作的参数

时间:2013-06-13 09:28:12

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

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

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

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

@ Model.layers是一个List

现在我试过:但是同样的错误:

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

3 个答案:

答案 0 :(得分:14)

看起来你在你的观点中这样做,这违反了关注点分离的原则。但这就是你要做的。

@
{
   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"))
{
  .....
}

更好的原因是您现在可以对代码进行单元测试,然后才能进行单元测试,因为它只是视图的一部分,但现在您可以运行自动化测试以确保获得正确的图层。

答案 1 :(得分:6)

对于其他人,我发现当我没有强类型视图时,我会在视图中出现此错误,例如在&之前是否意外输入了一个字符#34; @model type&#34; 行(因此现在不再制作模型类型声明。)

 @model SomeModel

答案 2 :(得分:1)

  1. 图层是List,Model.layers.Select将返回IEnumerable.

  2. 如果您只想返回KONT == ‘EUROPE'的图层,则应使用如下

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