【问题标题】:Which MVC Validation Framework哪个 MVC 验证框架
【发布时间】:2009-11-27 12:03:59
【问题描述】:

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

您在使用 xVal 方面有何经验?有没有好的替代验证框架不会抛出异常?

谢谢

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

【问题讨论】:

标签: asp.net-mvc validation exception xval


【解决方案1】:

【讨论】:

  • 不,我没有,但是快速浏览后,我认为这将非常有用。谢谢
  • 不幸的是,与 Castle 验证器和 xVal 相比,它缺少一些东西。例如,[ValidateSameAs]。是的,您可以编写自定义验证属性,但它必须应用于模型类而不是属性。所以它只向 ValidationSummery 显示错误消息。
【解决方案2】:

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

【讨论】:

  • 感谢罗伯特的提示。一个很好的答案,但没有真正的示例代码。我已经标记了你,但我不知道 MVC 2 Beta 中的新功能。
  • MVC2 的功能与 xVal 的功能非常相似,因此您仍然需要自己完成一些工作以使其尽可能自动化并避免代码重复。
【解决方案3】:

我认为 xVal 很棒,我一直将它与 Castle Validators 一起使用,并且效果很好。只要您在运行验证时捕获 RulesException 并将错误添加到您的 ModelState,例如

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

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

【讨论】:

  • 城堡验证器和 xVal 岩石。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多