代码之家  ›  专栏  ›  技术社区  ›  Dai Bok

哪个MVC验证框架

  •  3
  • Dai Bok  · 技术社区  · 16 年前

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

    您在使用XVAL方面有哪些经验?是否有不抛出异常的好的替代验证框架?

    谢谢

    (附:我注意到很多人都在读这本书,只是为了让你知道。 I am using Fluent Validation 现在)

    3 回复  |  直到 14 年前
        1
  •  5
  •   LiamB    16 年前
        2
  •  3
  •   Robert Koritnik    16 年前

    不,显示异常而不是一些简单的消息不是一个好的实践,因为没有什么严重的错误…你应该填充 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类似。因此,如果您不太深入到项目中,并且可以考虑使用 开发过程中的代码 作为你的基础,也许这就是你走的路。

        3
  •  2
  •   Chris Fulstow    16 年前

    我觉得XVAL很棒,我一直在用它 Castle Validators 而且效果很好。只要在运行验证时捕获rulesException,并将错误添加到您的模型状态,例如

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

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