簡體   English   中英

從驗證屬性中檢索模型MetaData

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM