请您指导我如何在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)
答案 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
保留在单独的变量中将评估一次。