Как узнать, какие типы валидаторов не сработали на модели в ASP.NET MVC 3? - PullRequest
0 голосов
/ 25 мая 2011

У меня есть некоторые стандартные атрибуты валидатора для некоторых свойств в моём классе моделей. HTML-форма публикуется на моем контроллере, и я могу проверить ModelState, чтобы убедиться, что она действительна, и узнать, какие свойства недопустимы. Это все хорошо. (Я не делаю никакой проверки на стороне клиента.)

Однако, иногда, если единственные свойства, не прошедшие проверку, это свойства с RequiredAttribute, я хочу рассматривать модель как допустимую.

Я мог бы использовать Reflection, чтобы проверить каждое из свойств, которые не прошли проверку, и посмотреть, есть ли у каждого свойства RequiredAttribute в его пользовательских атрибутах, но это кажется немного тяжелым. Есть ли какая-то часть API, о которой я не знаю, которая скажет мне типы валидаторов, которые потерпели неудачу?

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Ну, безумное требование требует безумного решения!В моем контроллере я использовал if(this.ModelState.IsValid)..., но теперь я могу использовать if(ValidatorChecker<ModelType>.IsModelStateValid(this.ModelState))...,
со следующим:

internal static class ValidatorChecker<TModel>
{
   public static bool IsModelStateValid(ModelStateDictionary modelState)
   {
      if (modelState.IsValid)
      {
         return true;
      }

      int totalErrors = 0, requiredAttributeErrors = 0;
      Type modelType = typeof(TModel);
      foreach (var key in modelState.Keys)
      {
         if (modelState[key].Errors.Count > 0)
         {
            totalErrors += modelState[key].Errors.Count;

            Type currentType = modelType;
            string[] typeParts = key.Split(
               new char[] { '.' },
               StringSplitOptions.RemoveEmptyEntries);
            int typeIndex = 0;

            if (typeParts.Length == 0)
            {
               continue;
            }
            else if (typeParts.Length > 1)
            {
               for (typeIndex = 0; typeIndex < typeParts.Length - 1; typeIndex++)
               {
                  currentType =
                     currentType.GetProperty(typeParts[typeIndex]).PropertyType;
               }
            }

            PropertyInfo validatedProperty =
               currentType.GetProperty(typeParts[typeIndex]);

            var requiredValidators =
               validatedProperty.GetCustomAttributes(typeof(RequiredAttribute), true);
            requiredAttributeErrors += requiredValidators.Length;
         }
      }

      return requiredAttributeErrors == totalErrors;
   }
}
0 голосов
/ 25 мая 2011

Проверка происходит как часть подшивки модели, которая извлекает коллекцию форм из запроса http и применяет атрибуты проверки. Я бы предложил создать атрибут валидации, который реализует требуемую валидацию. В настоящий момент выполняемая проверка практически бессмысленна, поскольку она не говорит вам, какое поле является недействительным.

Существует также скорость выполнения этого отражения много раз по многим запросам, это может быть ssssslllllllooooowwwwwww !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...