Asp.net mvc 3 Can';无法在MVC3 HTML帮助程序中获取自定义属性值

Asp.net mvc 3 Can';无法在MVC3 HTML帮助程序中获取自定义属性值,asp.net-mvc-3,data-annotations,custom-attributes,Asp.net Mvc 3,Data Annotations,Custom Attributes,我已经用一个方法扩展了HTML助手,该方法需要来自模型属性的属性值。所以我定义了一个自定义属性 public class ChangeLogFieldAttribute : Attribute { public string FieldName { get; set; } } 我的模型就是这样用的 [Display(Name = "Style")] [ChangeLogField(FieldName = "styleid")] publi

我已经用一个方法扩展了HTML助手,该方法需要来自模型属性的属性值。所以我定义了一个自定义属性

    public class ChangeLogFieldAttribute : Attribute {
        public string FieldName { get; set; }
    }
我的模型就是这样用的

    [Display(Name = "Style")]
    [ChangeLogField(FieldName = "styleid")]
    public string Style { get; set; }
在我的helper方法中,如果属性用于属性,我有以下代码来获取属性的FieldName值

        var itemName = ((MemberExpression)ex.Body).Member.Name;

        var containerType = html.ViewData.ModelMetadata.ContainerType;
        var attribute = ((ChangeLogFieldAttribute[])containerType.GetProperty(html.ViewData.ModelMetadata.PropertyName).GetCustomAttributes(typeof(ChangeLogFieldAttribute), false)).FirstOrDefault();
        if (attribute != null) {
            itemName = attribute.FieldName;
        }
然而,当我看到这段代码时,我得到了一个异常,因为containerType为null

我不确定我做的是否正确,但我从大约4个不同的来源得出了这一结论。如果你能为我的问题提出一个解决方案或替代方案,我将不胜感激

谢谢

使用解决方案更新

我使用了Darin Dimitrov的解决方案,尽管我不得不对其进行一些调整。以下是我补充的内容。我必须检查属性metatdata是否存在,一切都很好

        var fieldName = ((MemberExpression)ex.Body).Member.Name;

        var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData);
        if (metadata.AdditionalValues.ContainsKey("fieldName")) { 
            fieldName = (string)metadata.AdditionalValues["fieldName"];
        }

您可以使属性元数据感知:

public class ChangeLogFieldAttribute : Attribute, IMetadataAware
{
    public string FieldName { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["fieldName"] = FieldName;
    }
}
然后在辅助对象内部:

var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData);
var fieldName = metadata.AdditionalValues["fieldName"];

要获取属性名称,可以使用
metadata.PropertyName
而不是
((MemberExpression)ex.Body.Member.name
。但是,这对字段名不起作用,而且我没有看到任何
.FieldName
.MemberName