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