我一直在评估 xVal 作为在 ASP.Net MVC 框架中验证实体的框架。我最近发现,每次验证规则被破坏时,xVal 都会引发异常。对我来说这似乎是不正确的。例如,当用户填写表单时,忘记填写三个必填字段,则会抛出三个异常。这是好的做法吗?( 编辑: 我也读过这篇文章 所以我想这不是一个好的做法)

您使用 xVal 的体验如何?是否有好的替代验证框架不会抛出异常?

谢谢

(附:我注意到很多人都在读这篇文章,只是为了让你知道 我正在使用 Fluent 验证 现在)

有帮助吗?

其他提示

不,显示异常而不是一些简单的消息不是一个好习惯,因为没有什么严重的错误......你应该改为填充 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);
    }
}

微控制器2

Asp.net MVC 2 Beta 2 中的验证与 xVal 的做法类似。因此,如果您对项目不太了解并且可以考虑使用 代码开发进度 作为你的基础,也许这就是你要走的路。

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

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

ASP.NET MVC v2将推出自己的验证框架

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top