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

时间:2013-11-11 23:14:18

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

请您指导我如何在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)

2 个答案:

答案 0 :(得分:2)

调试和Lambda处理总是很棘手。

用户问了这个问题:Visual Studio debugging "quick watch" tool and lambda expressions并且解释说匿名函数实际上非常复杂,需要在编译器方面做很多工作。因此,你无法真正将它们放入快速手表或类似物中。

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

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

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

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

答案 1 :(得分:1)

你可以解析你的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"))

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