我使用需要来自模型属性的属性值的方法扩展了HTML帮助器。所以我已经定义了一个自定义属性。
public class ChangeLogFieldAttribute : Attribute {
public string FieldName { get; set; }
}
在我的模型中使用它就像这样。
[Display(Name = "Style")]
[ChangeLogField(FieldName = "styleid")]
public string Style { get; set; }
在我的帮助方法中,如果属性用于属性,我有以下代码来获取属性的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"];
}
答案 0 :(得分:11)
您可以识别属性元数据:
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"];