asp.net-mvc - expression.Compile() 与 ModelMetadata.FromLambdaExpression

标签 asp.net-mvc lambda modelmetadata

编写强类型 Html 助手有一个常见问题。 问题是如何检索属性名称/值对。 假设我们有以下 Html 帮助器声明:

public static string DatePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> expression) 

我找到了几种解决方案: 1.

var value = expression.Compile()( helper.ViewData.Model );
string name = ExpressionHelper.GetExpressionText( expression );
string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName( name );

2.

ModelMetadata metadata = ModelMetadata.FromLambdaExpression( expression, helper.ViewData );
Object value = metadata.Model;
String name = metadata.PropertyName;

3.仅使用 MemberExpression 获取成员名称

string GetPropertyName<T>(Expression<Func<T>> property)
{
    var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;
    if (propertyInfo == null)
    {
        throw new ArgumentException("The lambda expression 'property' should point to a valid Property");
    }
    return propertyInfo.Name;
}

所有这些都有与第一眼不同的实现(使用 Reflector 进行调查),但我没有深入研究。

我一直坚持使用多种方法来解决问题,并且想知道哪种解决方案更适合不同的情况以及为什么?

如果有任何帮助,我将不胜感激

最佳答案

这些解决方案用于两种不同的环境。

1) View 使用它来正确地为 html 字段添加前缀,以准备模型绑定(bind),并且与 ModelMetadata 几乎无关。如果您需要执行子表单,此代码将提供“Customer.Addresses[0].City”。

该方法只关心PropertyInfo.Name。这永远不会为您提供 [DisplayName] 属性的内容。

2) 主要用于处理模型元数据。 99% 的时间我都会使用方法二,除非你需要解决#1。这还将获取与 DataAnnotations 属性关联的元数据。这仍然会为您提供 [DisplayName] 的内容。

关于asp.net-mvc - expression.Compile() 与 ModelMetadata.FromLambdaExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3953525/

相关文章:

asp.net-mvc - 获取文件夹中的文件

c# - 具有内置审计跟踪的 ORM

asp.net-mvc - httpcontext 当前服务器映射路径显示 c :\inetpub\wwwroot when the current location is somewhere else

java - 为什么会出现不兼容的类型: incompatible parameter types in lambda expression?

java - 通用功能接口(interface)和类型删除

asp.net-mvc - asp.net mvc 中编辑器模板中复杂类型的 ModelMetadata

asp.net-mvc - 如何在 MVC 3 和 MVC 4 项目之间共享 web.config 文件

c++ - 为什么这个 lambda [=] 捕获会创建多个拷贝?

entity-framework - 如何在桌面应用程序中使用 DataAnnotations

asp.net - 获取 .NET Core 中类的 ModelMetadata