Какой MVC Validation Framework - PullRequest
       7

Какой MVC Validation Framework

3 голосов
/ 27 ноября 2009

Я оцениваю xVal как платформу для проверки сущностей в ASP.Net MVC Framework. Недавно я обнаружил, что каждый раз, когда правило проверки нарушается, xVal вызывает исключение. Мне кажется, это неправильно. Например, когда пользователь заполняет форму и забывает заполнить три обязательных поля, будут выданы три исключения. Это хорошая практика? (Правка: Я также читал это, , поэтому я думаю, что это не очень хорошая практика)

Какой у вас опыт использования xVal? Есть ли хорошая альтернативная структура проверки, которая не генерирует исключения?

Спасибо

(PS: я заметил, что многие люди читают это, просто чтобы сообщить вам Я использую Fluent Validation сейчас)

Ответы [ 3 ]

5 голосов
/ 27 ноября 2009

Вы смотрели проверку в бета-версии 2?

http://blogs.msdn.com/rickandy/archive/2009/10/03/client-side-validation-for-mvc-2-p2.aspx

3 голосов
/ 27 ноября 2009

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

Html.ValidationMessage("EntityPropertyName");

xVal поддерживает все это. А также проверка на стороне клиента перед отправкой формы обратно.

Какой-то код

Когда вы устанавливаете DataAnnotations атрибуты для ваших классов сущностей (или их сопутствующих классов метаданных), вы, скорее всего, также будете реализовывать метод Validate (). лучший способ - использовать T4, который автоматически сгенерирует их для вас, чтобы вам не приходилось повторять один и тот же код снова и снова ...

public IEnumerable<ErrorInfo> Validate()
{
    IList<ErrorInfo> errors = DataAnnotationsValidationRunner.GetErrors(this).ToList<ErrorInfo>();
    return errors.AsEnumerable();
}

Все, что вам нужно сделать, это позвонить по этому номеру:

IEnumerable<ErrorInfo> errors = entityObjectInstance.Validate();
if (errors.Any())
{
    new RulesException(errors).AddModelStateErrors(filterContext.Controller.ViewData.ModelState, entityPropertyName);
}

И чтобы еще больше автоматизировать это, вы можете реализовать это в фильтре действий, чтобы валидация была автоматической для объектов вашей сущности, которые передаются в действие контроллера. Действия контроллера должны были бы только проверить, является ли ModelState.IsValid() тогда.

Еще один класс, который вам здесь понадобится (где-то взят из Интернета):

public static class DataAnnotationsValidationRunner
{
    public static IEnumerable<ErrorInfo> GetErrors(object instance)
    {
        var metadataAttribute = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
        var metaClass = metadataAttribute != null ? metadataAttribute.MetadataClassType : instance.GetType();
        var metaClassProperties = TypeDescriptor.GetProperties(metaClass).Cast<PropertyDescriptor>();
        var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

        return from metaProp in metaClassProperties
               join modelProp in modelClassProperties on metaProp.Name equals modelProp.Name
               from attribute in metaProp.Attributes.OfType<ValidationAttribute>()
               where !attribute.IsValid(modelProp.GetValue(instance))
               select new ErrorInfo(metaProp.Name, attribute.FormatErrorMessage(string.Empty), instance);
    }
}

MVC 2

Проверка в Asp.net MVC 2 Beta 2 аналогична работе xVal. Так что, если вы не слишком далеко зашли в проект и можете рассмотреть возможность использования кода в процессе разработки в качестве основы, возможно, это ваш путь.

2 голосов
/ 27 ноября 2009

Я думаю, что xVal - это здорово, я использовал его с Castle Validators , и он отлично работает. Просто ловите исключение RulesException каждый раз, когда вы запускаете проверку, и добавляйте ошибки в свой ModelState, например,

try
{
  // execute validation runner
}
catch (RulesException ex)
{
   ex.AddModelStateErrors(ModelState, "prefix");
}

ASP.NET MVC v2 представит собственную платформу проверки .

...