Вопрос

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

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

Спасибо

(ПС:Я замечаю, что многие люди читают это, просто чтобы вы знали Я использую Беглую проверку сейчас)

Это было полезно?

Решение

Вы смотрели на валидацию в бета-версии 2?

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

Другие советы

Нет, показывать исключения вместо некоторых простых сообщений - не очень хорошая практика, потому что ничего серьезного не происходило неправильно...Вместо этого вы должны заполнить 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);
}

И чтобы автоматизировать это еще больше, вы можете реализовать это в фильтре действий, так что проверка будет автоматической для ваших объектов entity, которые передаются в действие контроллера.Действия контроллера должны были бы только проверить, является ли 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.Итак, если вы не слишком далеко продвинулись в проекте и можете рассмотреть возможность использования код в процессе разработки как ваш фонд, возможно, это тот путь, по которому вам следует идти.

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

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

ASP.NET MVC v2 представит свой собственный структура валидации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top