我实际上使用其他验证方法很好。似乎没有很多选项预先构建用于使用ASP.NET MVC 1.0进行验证。我看到人们谈论的主要内容是xVal。但是,实际上没有相关文档。事实上,创始人的博客似乎只有两个帖子。
无论如何,这是我见过的唯一可以提供客户端验证的东西。我的问题是我不能使用基于属性的东西,因为我使用LLBLGen生成我的模型,我不想修改代码。
我读到的关于xVal的所有内容都谈到了实现IRulesProvider的可能性,但没有关于如何去做和使用它的真实信息。我发现了一些实现它的代码,但是使用了我无法实现的属性。
如果我不是手工编写我的模型类或者使用DataAnnotations或类似的东西,那么任何人都可以提供有关如何使用xVal的一些指导(我对xVal的替代方案开放,但我没有看到任何内容和我需要坚持使用ASP.NET MVC 1.0,我需要客户端验证支持)?
编辑:我不认为部分类方法对我有用,因为我会生成很多代码,并且它们将在不同的程序集中。
答案 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);
}
}
}