使用xVal进行ASP.NET MVC 1.0验证

时间:2010-01-17 05:53:02

标签: asp.net-mvc validation xval

我实际上使用其他验证方法很好。似乎没有很多选项预先构建用于使用ASP.NET MVC 1.0进行验证。我看到人们谈论的主要内容是xVal。但是,实际上没有相关文档。事实上,创始人的博客似乎只有两个帖子。

无论如何,这是我见过的唯一可以提供客户端验证的东西。我的问题是我不能使用基于属性的东西,因为我使用LLBLGen生成我的模型,我不想修改代码。

我读到的关于xVal的所有内容都谈到了实现IRulesProvider的可能性,但没有关于如何去做和使用它的真实信息。我发现了一些实现它的代码,但是使用了我无法实现的属性。

如果我不是手工编写我的模型类或者使用DataAnnotations或类似的东西,那么任何人都可以提供有关如何使用xVal的一些指导(我对xVal的替代方案开放,但我没有看到任何内容和我需要坚持使用ASP.NET MVC 1.0,我需要客户端验证支持)?

编辑:我不认为部分类方法对我有用,因为我会生成很多代码,并且它们将在不同的程序集中。

2 个答案:

答案 0 :(得分:4)

通过在分部类上使用MetadataType属性,可以将xVal与LLBLGen或任何其他ORM生成的类一起使用。例如,如果您有一个名为UserEntity的LLBL生成实体,您将创建一个分部类并使用MetadataType属性将其标记为:

[MetadataType(typeof(UserEntityMetaData))]
public partial class UserEntity
{
}

您将创建Meta类,您可以使用适当的属性标记属性,如下所示:

public class UserEntityMetaData
{
    [Required()]
    [StringLength(50)]
    [DataType(DataType.EmailAddress)]
    public object EmailAddress { get; set; }
    [Required()]
    [StringLength(32)]
    [DataType(DataType.Password)]
    public object Password { get; set; }
    [Required()]
    [StringLength(25)]
    public object FirstName { get; set; }
    [Required()]
    [StringLength(25)]
    public object LastName { get; set; }
}

这样您就不必更改LLBL生成的代码,只需更改自定义的部分类。唯一的问题是,您需要将partial类和Meta类放在与生成的实体类相同的名称空间中。您不必这样做,但是当您调用xVal验证时,它会使事情变得更容易。

答案 1 :(得分:1)

除了jcerhea所说的,你还需要修改DataAnnotationsValidationRunner类如何设置来处理GetErrors方法中的“伙伴”类,例如

    namespace Entities
    {
        public static class DataAnnotationsValidationRunner
        {
            public static IEnumerable<ErrorInfo> GetErrors(object instance)
            {
                var metadataAttrib = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
                var buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType();
                var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>();
                var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

                return from buddyProp in buddyClassProperties
                       join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name
                       from attribute in buddyProp.Attributes.OfType<ValidationAttribute>()
                       where !attribute.IsValid(modelProp.GetValue(instance))
                       select new ErrorInfo(buddyProp.Name, attribute.FormatErrorMessage(string.Empty), instance);
            }
        }
    }