不,显示异常而不是一些简单的消息不是一个好习惯,因为没有严重的问题...您应该使用这些错误填充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 所做的。因此,如果您对项目不太了解,并且可以考虑使用正在开发中的代码作为您的基础,也许这就是适合您的方式。