如何在 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 表达式?的主要内容,如果未能解决你的问题,请参考以下文章