【问题标题】:how does mvc HtmlHelper DisplayFor function extract the full property path from the lambda function?mvc HtmlHelper DisplayFor 函数如何从 lambda 函数中提取完整的属性路径?
【发布时间】:2017-01-25 01:08:36
【问题描述】:

我看到 mvc 正在查找从 Html.DisplayFor 方法中的 lambda 函数传递给它的变量的名称:

@Html.HiddenFor(model => myModel.propA.propB)

可以生成类似于以下内容的 HTML:

<input id="myModel_propA_propB" type="hidden" value="" >

它显然是在使用反射,但它超出了我的范围。有人可以填我吗?

另外,是否可以创建一个 HTML 辅助函数,它采用完全属性引用而不是 lambda 函数来完成类似的事情?即。

@Html.HiddenFor(myModel.propA.propB)

...帮助器可以传递完整的“myModel.propA.propB”引用,而不仅仅是propB的值? lambda 函数是完成此类任务的一种奇怪的 .net 解决方法,还是它实际上是所有编程学科的首选方法。

【问题讨论】:

    标签: asp.net-mvc reflection html-helper


    【解决方案1】:

    实际上,它正在遍历您传递给辅助方法的表达式树以获取属性名称。在实践中,它看起来像:

    MemberExpression memberExpression = (MemberExpression) expression.Body;
    propertyName = memberExpression.Member.Name;
    

    当然这并不完整——例如,当传入的表达式中有多个属性调用时,你必须沿着表达式链向上走,你必须考虑传入的其他表达式类型,而不是 MemberExpression,等等,等等 - 但你明白了。请记住,表达式是表示为数据的代码表达式。此外,由于 MVC 是开源的,如果您愿意,您可以在源代码中查找它们用来获取 html 名称的确切代码。

    要解决您的第二个问题,答案是否定的。在没有 lambda 的情况下传递“仅属性”(这将是一个 Expression&lt;Func&lt;T,object&gt;&gt;)是行不通的,因为函数只能看到传入的值 - 而没有关于调用代码如何到达该值的信息。

    【讨论】:

      猜你喜欢
      • 2023-02-14
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 2020-05-28
      相关资源
      最近更新 更多