[英]Retrieving Model MetaData from within a validation attribute
使用MVC4我需要從自定義ValidationAttribute
檢索當前的ModelMetadata
。 原因是驗證屬性需要知道哪些其他屬性附加到正在驗證的特定屬性。
具體來說,它檢查屬性是否附加了一個UppercaseAttribute
; 如果是這種情況,那么它將執行不同的邏輯路徑。 如果可以從ValidationAttribute
獲取ModelMetadata
,我將使用以下代碼來檢查它:
ModelMetadata.ContainerType
.GetProperty(ViewData.ModelMetadata.PropertyName)
.GetCustomAttributes(typeof(UppercaseAttribute), true)
首先,是否可以從自定義ValidationAttribute
檢索ModelMetadata
。
其次,上面的代碼是檢查屬性是否附加了特定屬性的最佳實踐。
這是你可以做的:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var model = validationContext.ObjectInstance;
var displayName = validationContext.DisplayName;
var propertyName = model.GetType().GetProperties()
.Where(p => p.GetCustomAttributes(false).OfType<DisplayAttribute>().Any(a => a.Name == displayName))
.Select(p => p.Name).FirstOrDefault();
if (propertyName == null)
propertyName = displayName;
var property = model.GetType().GetProperty(propertyName);
var uppercaseAttribute = property.GetCustomAttributes(typeof(UppercaseAttribute), false).SingleOrDefault() as UppercaseAttribute;
if (uppercaseAttribute != null)
{
// some code...
}
// return validation result...
}
出於某種原因,validationContext.MemberName始終為null,因此您必須根據其顯示名稱獲取屬性名稱。
回答你的第一個問題:是的。 您可以訪問ValidationAttribute
對象中的ModelMetadata
對象。 最簡單的方法是實現System.Web.Mvc.IMetadataAware
接口。 該接口有一個名為OnMetadataCreated
方法,它將在驗證屬性對象上的IsValid
方法之前調用。 此方法用於接收當前的ModelMetadata對象。 以下代碼演示了用法:
public class MyCustomValidationAttribute : ValidationAttribute, IMetadataAware
{
private readonly object _typeId = new object();
private ModelMetadata _metadata;
public MyCustomValidationAttribute()
{
}
public override object TypeId
{
get
{
return _typeId;
}
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
//Do something with the meta data
string propertyName = _metadata.PropertyName;
return ValidationResult.Success;
}
public void OnMetadataCreated(ModelMetadata metadata)
{
_metadata = metadata;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.