如何在 Razor 视图中测试 lambda 表达式?

Posted

技术标签:

【中文标题】如何在 Razor 视图中测试 lambda 表达式?【英文标题】:How to test lambda expressions in Razor view? 【发布时间】:2013-11-23 22:25:14 【问题描述】:

您能否指导我如何在 Razor 视图引擎中设置断点来测试我的 lambda 表达式?

例如,我有以下代码:

@(html.DropDownList("Condition4", 
                    new SelectList(Model
                                   .Conditions
                                   .Where(c => 
                                          c.TxCondition.TxConditionTypeId == Model.ConditionTypes.Single
                                          ct => ct.TxConditionType.ConditionTypeCode == "Region")
                                    .TxConditionType
                                    .TxConditionTypeId), 
                    "TxCondition.TxConditionId", 
                    "ConditionTitle",
                    Model.SearchCondition.Condition4), 
    "All"))

在断点我尝试使用"Quick Watch Windows" 测试以下代码,但错误是“表达式不能包含 lambda 表达式”

您能指导我如何在 MVC Razor 视图中测试 lambda 表达式吗?

非常感谢您的时间和帮助。

Model.Conditions.Where(c => c.TxCondition.TxConditionTypeId == 1)

【问题讨论】:

当我试图更好地格式化您的代码时,我注意到您的括号有点夸张。你至少有一个额外的,看起来你没有正确设置它们。 【参考方案1】:

调试和 Lambda 总是很难处理。

一位用户提出了这个问题:Visual Studio debugging "quick watch" tool and lambda expressions,并解释说匿名函数实际上非常复杂,需要编译器进行大量工作。因此,您不能真正将它们放入快速手表或类似产品中。

我无法真正解决您的问题,但我想建议一种稍微不同的方法。

在 MVC 中 views 应该是愚蠢的;他们真的应该“做事”。我的意思是他们不应该真正关心创建变量、执行逻辑、选择或实例化对象等等。相反,应该简单地获取给它的对象并尝试显示它们。

这迫使您将所有这些东西放在代码库的其他位置。适当使用良好的架构、分层和关注点分离将帮助您组织事物,包括业务逻辑。此外,我建议,在使用 Lambda 编写逻辑时,如果 Lambda 有点复杂,请将组件分成几部分,以便更容易调试和逐步执行。

ICollection<object> filter1 = someCollection.Where(x => x.IsAvailable);
object myObject = filter1.SingleOrDefault(x => x.SomeString = "aValue").Distinct();

【讨论】:

【参考方案2】:

您可以分离您的 Lamba 表达式以检查它(可能不是确切的 Razor 语法):

var conditionTypeId = Model
                        .ConditionTypes
                        .Single(ct => ct.TxConditionType.ConditionTypeCode == "Region")
                        .TxConditionType
                        .TxConditionTypeId;
var selectListContent = Model
                            .Conditions
                            .Where(c => c.TxCondition.TxConditionTypeId == conditionTypeId)
                            .ToList();

@(Html.DropDownList("Condition4", 
                  new SelectList(selectListContent, "TxCondition.TxConditionId", "ConditionTitle",Model.SearchCondition.Condition4), 
                  "All"))

看看Where语句后面的.ToList(),这样调试时可以查看结果列表的内容。除此之外,这将为您的代码增加一些可读性(其他开发人员会感谢您,以及您自己的未来)。 将conditionTypeId 保存在单独的变量中将计算一次。

【讨论】:

以上是关于如何在 Razor 视图中测试 lambda 表达式?的主要内容,如果未能解决你的问题,请参考以下文章

Razor 是不是支持 lambda 表达式?

asp mvc razor 存储 lambda 表达式以列出并重用它

Razor 视图引擎:表达式树可能不包含动态操作

razor视图使用三元表达式

如何将 lambda 传递给 Razor 辅助方法?

如何在 Razor 视图中基于安全性隐藏特定元素,而视图中没有逻辑?