1

我实际上可以使用另一种验证方法。使用 ASP.NET MVC 1.0 进行验证的预构建选项似乎并不多。我看到人们谈论的主要内容是 xVal。但是,实际上没有任何文档。事实上,创始人的博客似乎只有两篇文章。

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

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

因此,如果我不手动编码我的模型类或不打算使用 DataAnnotations 或类似的东西,任何人都可以提供一些关于如何使用 xVal 的指导(我对 xVal 的替代方案持开放态度,但我没有看到任何东西,我需要坚持使用 ASP.NET MVC 1.0,我需要客户端验证支持)?

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

4

2 回答 2

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 生成的代码,只需更改您的自定义部分类。唯一需要注意的是,您将希望分部类和 Meta 类与生成的实体类位于同一命名空间中。您不必这样做,但是当您调用 xVal 验证时,它会使事情变得更容易。

于 2010-01-17T15:51:50.963 回答
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);
            }
        }
    }
于 2010-01-17T22:43:10.813 回答