哪个MVC验证框架

时间:2009-11-27 12:04:00

标签: asp.net-mvc validation exception xval

我一直在评估xVal作为验证ASP.Net MVC框架中实体的框架。我最近发现,每次验证规则被破坏时,xVal都会导致抛出一个激活。对我来说似乎不正确。例如,当用户填写表单并忘记填写三个必填字段时,将抛出三个异常。这是好习惯吗? (编辑:I also read this,所以我猜它不是很好的做法)

您使用xVal的经历是什么?是否存在不会抛出异常的良好替代验证框架?

由于

(PS:我注意到很多人都在读这篇文章,只是为了让你知道I am using Fluent Validation现在)

3 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

不是一个好的做法是显示异常而不是一些简单的消息,因为没有严重的错误...你应该用这些错误填充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 :(得分:2)

我认为xVal非常好,我一直在使用Castle Validators并且它完美无缺。只要在运行验证时捕获RulesException并将错误添加到ModelState,例如

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

ASP.NET MVC v2将引入自己的validation framework