【问题标题】:Get value from ASP.NET MVC Lambda Expression从 ASP.NET MVC Lambda 表达式中获取价值
【发布时间】:2011-04-18 07:40:42
【问题描述】:

我正在尝试创建自己的 HTML 助手,它接受一个表达式(类似于内置的 LabelFor 助手。当表达式类似于此时,我找到了获取属性值的示例:

model => model.Forename

但是,在我的某些模型中,我想获取子元素中的属性,例如

model => mode.Person.Forename

在这些示例中,我无论如何都找不到(轻松)获得 Forename 的值。任何人都可以建议我应该如何获得这个价值。

谢谢

【问题讨论】:

    标签: c# html asp.net-mvc lambda html-helper


    【解决方案1】:

    如果您使用的模式与 LabelFor 方法使用的模式相同,则表达式将始终是 LambdaExpression,您只需执行它即可获取值。

    var result = ((LambdaExpression)expression).Compile().DynamicInvoke(model);
    

    通常,您始终可以将泛型表达式包装在 LambdaExpressions 中,然后编译并调用它们以获取值。

    如果您想要的不是 Forename 的值,而是字段本身(用于打印字符串“Forename”),那么您唯一的选择是使用某种形式的表达式遍历。在 C#4 中,框架提供了一个名为 ExpressionVisitor 的类,可用于此目的,但对于框架的早期版本,您必须自己实现它 - 请参阅:http://msdn.microsoft.com/en-us/library/bb882521(VS.90).aspx

    【讨论】:

      【解决方案2】:

      您正在寻找价值?

      为什么这不起作用?

          public object GetValue<T>( Expression<Func<T>> accessor )
          {
              var func = accessor.Compile();
      
              return func.Invoke();
          }
      

      【讨论】:

        【解决方案3】:

        我已经单独回答了这个问题,因为我不喜欢接受的答案有两点。

        1. 它没有说明如何获取对模型的引用,这是编写自定义 html 帮助程序时的关键信息
        2. 如果您预先知道 lambda 表达式的委托类型是什么,则无需将其强制转换为 Lambda 表达式并使用 DynamicInvoke。根据我编写自定义助手的经验,我倾向于预先了解类型。

        我预先知道它是为产生字节数组的 lambda 表达式而设计的示例:

        public static MvcHtmlString MyHelper<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, byte[]>> expression)
            {
        
                var compiledExpression = expression.Compile();
                byte[] byteData = compiledExpression(htmlHelper.ViewData.Model);
        
                ...
                ...
                ...
        
                return new MvcHtmlString(.......);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多