Jef*_*ddy 5 custom-attributes data-annotations asp.net-mvc-3
我用一个需要来自模型属性的属性值的方法扩展了HTML帮助器.所以我已经定义了一个自定义属性.
public class ChangeLogFieldAttribute : Attribute {
public string FieldName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的模型中使用它就像这样.
[Display(Name = "Style")]
[ChangeLogField(FieldName = "styleid")]
public string Style { get; set; }
Run Code Online (Sandbox Code Playgroud)
在我的帮助方法中,如果属性用于属性,我有以下代码来获取属性的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;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我到达此代码时,我得到一个异常,因为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"];
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*rov 11
您可以使属性元数据识别:
public class ChangeLogFieldAttribute : Attribute, IMetadataAware
{
public string FieldName { get; set; }
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["fieldName"] = FieldName;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在助手里面:
var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData);
var fieldName = metadata.AdditionalValues["fieldName"];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3303 次 |
| 最近记录: |