【问题标题】:How to test lambda expressions in Razor view?如何在 Razor 视图中测试 lambda 表达式?
【发布时间】: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)

【问题讨论】:

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

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


【解决方案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 保存在单独的变量中将计算一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2013-06-18
      • 2018-09-19
      • 2021-03-10
      • 1970-01-01
      相关资源
      最近更新 更多