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

3

请问如何在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"))

在断点处,我尝试使用“快速监视窗口”测试以下代码,但出现了错误“表达式不能包含lambda表达式”

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

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

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

当我试图更好地格式化您的代码时,我注意到您的括号有点混乱。您至少有一个多余的括号,并且看起来您没有正确设置它们。 - crthompson
2个回答

2
调试和Lambda表达式总是很棘手的。
一个用户提出了这个问题:Visual Studio调试“快速监视”工具和Lambda表达式,并解释说匿名函数实际上非常复杂,需要编译器大量的工作。因此,你不能真正将它们放入快速监视或类似的工具中。
我无法真正解决你的问题,但我想提出略微不同的方法。
在MVC中,视图应该是愚蠢的;它们应该只是“做事情”。我的意思是,它们不应该关心创建变量、执行逻辑、选择或实例化对象等等。相反,它们应该简单地接受给定的对象,并尝试显示它们。
这迫使你将所有这些东西放在代码库的其他地方。适当使用良好的架构、分层和关注点分离将有助于组织事物,包括业务逻辑。此外,我建议,在使用Lambda编写逻辑时,如果Lambda有点复杂,请将组件划分为几个部分,以便更容易调试和跟踪。
ICollection<object> filter1 = someCollection.Where(x => x.IsAvailable);
object myObject = filter1.SingleOrDefault(x => x.SomeString = "aValue").Distinct();

1
你可以分离你的lambda表达式以便进行检查(可能不是精确的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保留在单独的变量中将只评估一次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接