[英]Custom Validation in MVC2 clarification - Following an example of scott gu's
我试图在我的asp.net mvc 2应用程序中实现数据验证,之后是scott gu在这里的不错的帖子: http : //weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2 -model-validation.aspx
我现在需要的不仅仅是基本验证(Required,Range,StringLength ...)
我想实现一个重复的检查器,但是不幸的是,他的帖子开始在自定义验证部分丢失细节。
看到:
步骤4:创建自定义[电子邮件]验证属性
.NET Framework中的System.ComponentModel.DataAnnotations命名空间包括许多可以使用的内置验证属性。 在上面的示例中,我们使用了4种不同的参数-[Required],[StringLength],[Range]和[RegularExpression]。
您还可以选择定义自己的自定义验证属性,也可以使用它们。 您可以通过派生System.ComponentModel.DataAnnotations命名空间中的ValidationAttribute基类来定义完全自定义属性。 另外,如果您只想扩展其基本功能,则可以选择从任何现有验证属性中派生。
所以这就是我到目前为止所拥有的...我从这里去哪里???
(请注意,为解决我的问题,我简化了此操作,我意识到在现实生活中检查重复的人对象,您将要做的不仅仅是检查名字和姓氏)
[MetadataType(typeof(PersonMetaData))]
public partial class Person
{
//Validation rules for the Person class
[Bind(Exclude = "PersonID")]
public class PersonMetaData
{
//[DisplayName("Person")]
[Required(ErrorMessage = "A Person Code is required")]
[DuplicatePerson(ErrorMessage = "Bad!")]
public object PersonCode { get; set; }
}
}
public class DuplicatePersonAttribute : ValidationAttribute
{
readonly PeopleDB peopleDB = new PeopleDB();
public bool IsDuplicate(object value)
{
//var isDuplicate = peopleDB.People.Select(x => x.PersonCode == value);
//Return false if duplicate in DB
return false;
}
}
这是我用来在用户注册中强制执行唯一电子邮件的操作:
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property,AllowMultiple = false,Inherited = true)]公共类UniqueEmailAttribute:ValidationAttribute {public UniqueEmailAttribute():base(“'{0}'的值已被使用”){}
public override bool IsValid( object value )
{
string toCheck = value as string;
if( String.IsNullOrEmpty(toCheck) ) return false;
return ( DataRepository.GetMembersByEmail(toCheck).Count() == 0 );
}
[Inject]
public IDataRepository DataRepository { get; set; }
}
唯一可能在这里不能合理解释的是[Data]属性来装饰DataRepository属性。 它由nInject库提供,作为进行依赖项注入(控制反转)的一种方法,因此我可以将数据库访问与应用程序分开。 但是在合并DI之前,我只是让该属性创建了一个具体的DataRepository对象的实例并使用了该实例(当然,这不是一个好习惯,这就是为什么我要使用nInject路由)。
在进行SoC(关注分离)之后,您不应在模型上进行这种验证,而应在控制器上进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.