2010-10-15 2 views
0

У меня есть модель представления, подобная той, которая создана на моем валидаторе.Динамическая проверка каждого значения KeyValuePair модели

public class ViewModel 
{ 
    public KeyValuePair<int, RuleType> Foo { get; set; } 
    public KeyValuePair<string, RuleType> Bar { get; set; } 
} 

Моя реальная модель просмотра имеет 20+ полей. Как только мои данные будут проверены, общий список типа ViewModel затем возвращается в мое представление MVC и обрабатывается в отчете. Однако появился запрос функции, в котором пользователи хотят видеть только модели с ошибками и предупреждениями, исключая действительные объекты. RuleType - перечислитель. Модель действительна, если все значения пары ключей: RuleType.Success.

Можно ли прокручивать каждую модель и проверять RuleType без необходимости вручную проверять каждое свойство? Моя функция GetAllModelsWithErrors() вернет список недопустимых моделей. Я считаю, что отражение может быть решением, но я не уверен, что это хорошее решение.

+1

Вы можете либо зарегистрировать все свойства вашей ViewModel или использовать отражение. Вы можете зарегистрировать их, например, с помощью мутанта 'set' каждого свойства (таким образом, вы получите коллекцию экземпляров' KeyValuePair', и вы можете проверить их). –

ответ

2

Попробуйте это:

private IEnumerable<ViewModel> GetInvalidModels(ViewModel[] viewModels) 
    { 
     return 
      from viewModel in viewModels 
      from prop in typeof(ViewModel).GetProperties() 
      let ruleType = ((KeyValuePair<object, RuleType>)prop.GetValue(viewModel, null)).Value 
      where ruleType != RuleType.Success 
      select viewModel; 
    } 
+0

Линия 'let ruleType' выдает недопустимое исключение, когда я использую' ToList() 'для своих результатов. Должен ли я делать что-то другое, если некоторые из моих значений KeyValuePair имеют типы с нулевым значением? – Mike

+0

Как вы сами сказали: «Модель действительна, если все значения пары ключей являются RuleType.Success». Поэтому мой запрос основан на предположении, что ваши значения в KeyValuePairs всегда имеют тип RuleType, который является Enum и, следовательно, не может быть недействителен. – danijels

+0

Ты совершенно прав. Спасибо. :) – Mike

Смежные вопросы