我与使用另一种验证方法实际上细。它似乎还有不预构建与ASP.NET MVC 1.0做验证多种选择。我看到人们谈论的主要是XVAL。然而,从字面上它的文档。事实上,创始人的博客,似乎只有像这两个职位。

不管怎么说,这是我见过的唯一的东西,还可以提供客户端验证。我的问题是,我无法使用基于属性的东西,因为我使用LLBLGEN产生我的模型,我不想修改代码。

一切我读过有关如何实施的IRulesProvider而是如何去这样做,并使用它没有真正的信息的可能性XVAL会谈。我发现一些代码,实现它,但使用的属性,我不能真正做到。

因此,谁能提供关于如何使用XVAL如果我不交出我的编码模型类或打算使用DataAnnotations或类似的东西一些指导(我打开替代XVAL但我还没有看到任何东西,我需要坚持使用ASP.NET MVC 1.0和我需要客户端验证支持)?

编辑:我不认为一个分部类的方法将适合我,因为我将生成的代码了很多,他们会在不同的组件

有帮助吗?

解决方案

可以使用与XVAL LLBLGEN或任何其他ORM通过使用上一个局部类MetadataType属性生成的类。例如,如果你有称为UserEntity一个LLBL生成的实体则需要创建一个局部类,并用这样的MetadataType属性标记它:

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

您会比创建元类,你可以像这样适当属性标记的属性:

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,只是你自定义的部分类。唯一的缺点是,你会希望两个部分类,并在相同的命名空间生成的实体类的元类。你没有做到这一点,但它使事情变得更容易,当你调用XVAL验证。

其他提示

除了什么jcerhea说你还需要修改DataAnnotationsValidationRunner类是如何设置以处理GetErrors方法,e.g“好友”类。

    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);
            }
        }
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top