无法将lambda表达式转换为' bool'因为它不是委托类型?

时间:2017-08-16 08:22:50

标签: c# asp.net-mvc lambda

我正在研究MVC,它向用户显示请求列表。该模型看起来像这样:

public class RequestModel 
{
    public string Status { get; set; }
}

控制器看起来像这样:

public ActionResult Index()
{
    return View(db.Requests.ToList());
}

我希望索引视图页面显示状态为" Pending"的请求列表,我尝试使用以下代码:

<table class="table">
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @if (modelItem => item.Status == "Pending")
                {
                    @Html.DisplayFor(modelItem => item.Status)
                }
            </td>
        </tr>
    }
</table>

然而,这给了我以下错误:

  

无法将lambda表达式转换为&#34; bool&#34;因为它不是委托类型。

我不确定这些错误意味着什么,以及如何解决它。如果有人有任何帮助或建议我会非常感激。

3 个答案:

答案 0 :(得分:5)

您的情况应如下:

@if (item.Status == "Pending")

你正在尝试使用lambda表达式(modelItem => item.Status == "Pending"),你应该使用简单的条件。

答案 1 :(得分:4)

通过编写此modelItem => item.Status == "Pending",您将定义一个函数:

Func<string,bool> someFunc = (str) => str == "Pending";

你知道你的if语句看起来像下面的那样,这意味着你没有在if语句中评估bool,而是有一个委托对象。

if(someFunc) // causes compilation error
{
    // some code
}

请注意,它没有调用函数并计算布尔结果:

if(someFunc(item.Status))
{
    // some code
}

要更正它,请删除modelItem =>

如果在“查看”中,您始终需要具有&#34;待定&#34;状态然后考虑将过滤逻辑移动到控制器,但在返回的集合上添加Where子句。

答案 2 :(得分:3)

正如其他答案所示,@if (item.Status == "Pending")应该可以解决您的问题。

modelItem => item.Status == "Pending"创建 Func 。 (如果您不熟悉匿名方法和lamda表达式,这些视频将非常有用:Tuts+kudvenkatkudvenkat

此外,如果您只想在视图中使用待处理项目,则可以在Controller中自行过滤它们。如果您的请求表有数千条记录,那么在您的视图中循环遍历这些记录效率不高

public ActionResult Index()
{
    return View(db.Requests.Where(r => r.Status == "Pending").ToList());
}