【发布时间】:2014-10-21 08:37:12
【问题描述】:
我有以下情况 - 我需要编写一个自定义附加元数据属性,该属性基于另一个属性值(来自同一模型),将一个值添加到 AdditionalValues 字典。现在,我的问题是我无法访问属性类中的模型实例。
[AttributeUsage(AttributeTargets.Property)]
public class ExtendedAdditionalMetadataAttribute : Attribute, IMetadataAware
{
#region Private properties
private string extraFieldToCheck { get; set; }
private string extraFieldValueToCheck { get; set; }
private string fieldToBeAdded { get; set; }
private string fieldValueToBeAdded { get; set; }
#endregion
#region Constructor
public ExtendedAdditionalMetadataAttribute(string extraFieldToCheck, string extraFieldValueToCheck,
string fieldToBeAdded, string fieldValueToBeAdded)
{
this.extraFieldToCheck = extraFieldToCheck;
this.extraFieldValueToCheck = extraFieldValueToCheck;
this.fieldToBeAdded = fieldToBeAdded;
this.fieldValueToBeAdded = fieldValueToBeAdded;
}
#endregion
public void OnMetadataCreated(ModelMetadata metadata)
{
// HOW TO GET THE MODEL CLASS INSTANCE???
// metadata.ContainerType is correct by metadata.Container is null.
}
}
正如您从代码 cmets 中看到的,在 OnMetadataCreated 内部我需要访问 Model 类实例,但是,尽管 ContainerType 是正确的,但 Container 属性是 NULL。
你能帮我提一下这个问题吗?
提前致谢!
埃夫丁
稍后编辑
考虑到我没有给出太多解释,我也将在此处粘贴一个示例,说明我想如何在模型类上使用此属性:
/// <summary>
/// Gets or sets the IsAccountCreated
/// </summary>
/// <value>The IsAccountCreated.</value>
[UIHint("FormFieldStringTemplate")]
[ExtendedAdditionalMetadata("IsExternalAccount", "true", "ReadOnly", "true")]
public override Boolean IsAccountCreated { get; set; }
/// <summary>
/// Gets or sets the IsAccountEnabled
/// </summary>
/// <value>The IsAccountEnabled.</value>
[Display(Name = "Este cont activ?")]
[UIHint("FormFieldStringTemplate")]
[ExtendedAdditionalMetadata("IsExternalAccount", "true", "ReadOnly", "true")]
public override Boolean IsAccountEnabled { get; set; }
/// <summary>
/// Gets or sets the IsExternalAccount
/// </summary>
/// <value>The IsExternalAccount.</value>
[Display(Name = "Este cont extern?")]
[UIHint("FormFieldStringTemplate")]
[AdditionalMetadata("ReadOnly", "true")]
public override Boolean IsExternalAccount { get; set; }
稍后编辑
虽然@stephen-muecke 给出的响应在当前情况下更简单且可以接受,但为了编程挑战,我已经寻找其他选项,我发现了以下可能性:实现自定义DataAnnotationsModelMetadataProvider 类。简而言之 - 它有效,并且我能够获得模型类实例但只有当模型类是一个简单类时,否则会有很多缺点 - 例如,如果你有一个模型类并且你在你的视图中使用它那么没关系,但如果你在另一个类中有一个类(视图模型中的一个模型),那么这种方法就不再可用了。
再次感谢@stephen-muecke!
【问题讨论】:
-
试试
metadata.Model -
它没有帮助,因为
metadata.Model给了我应用属性的属性的值,我不需要这个值 - 我需要做的是添加一个值如果取自extraFieldToCheck的属性值等于属性extraFieldValueToCheck的值,则添加到AdditionalValues字典。 -
到目前为止,我已经尝试了以下方法 - 通过反射访问“其他”属性,如下所示:
PropertyInfo modelProperty = metadata.ContainerType.GetProperty(this.extraFieldToCheck, BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static);但modelProperty始终为空。
标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5