2011-01-16 7 views
3

Как вы проверяете класс с использованием атрибутов проверки при проверке сильно типизированных моделей просмотра.MVC Validation Attribute

Предположим, у вас есть вид модели, как так:

[PropertiesMustMatch("Admin.Password", "Admin.ConfirmPassword")] 
public class AdminsEditViewModel 
{ 
    public AdminsEditViewModel() 
    { 
     this.Admin = new Admin(); // this is an Admin class 
    } 

    public IEnumerable<SelectListItem> SelectAdminsInGroup { get; set; } 


    public IEnumerable<SelectListItem> SelectAdminsNotInGroup { get; set; } 

    public Admin Admin { get; set; } 
} 

я получаю пустой исключения, когда на этой линии PropertiesMustMatchAttribute

object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value); 

, поскольку поле Password это свойство класса администратора и NOT AdminsEditViewModel. Как мне сделать так, чтобы он прошел столько уровней, пока не найдет свойство Admin в ViewModel AdminsEditViewModel? спасибо

ответ

1

Вам необходимо изменить класс PropertiesMustMatchAttribute, чтобы проанализировать имя и поиск недвижимости.

Этот атрибут не является частью рамки; он включен в шаблон MVC по умолчанию (в AccountModels.cs)
Вы можете изменить его в соответствии с вашими потребностями.

В частности, вы бы назвали name.Split('.'), затем прокрутите разделенные имена и получите значения свойств.
Это будет выглядеть примерно так

object GetValue(object obj, string properties) { 
    foreach(strong prop in properties) 
     obj = TypeDescriptor.GetProperties(obj) 
          .Find(prop, ignoreCase: true) 
          .GetValue(obj); 
    } 
    return obj; 
} 
+0

не уверен, как это сделать. можете ли вы предоставить дополнительную информацию об этом. спасибо – ShaneKm

+0

@Shane: Здесь вы идете. (непроверенный) – SLaks

+0

это сделал !. благодаря – ShaneKm