C# MVC2澄清中的自定义验证-以下是scott gu的示例
我正在尝试在我的asp.net mvc 2应用程序中实现数据验证,下面是scott gu的精彩文章: 我现在需要的不仅仅是所需的基本验证、范围、字符串长度 我想实现一个重复的检查器,但不幸的是,他的帖子开始丢失自定义验证部分的详细信息 见: 步骤4:创建自定义[电子邮件]验证属性 .NET Framework中的System.ComponentModel.DataAnnotations命名空间包含许多可以使用的内置验证属性。我们在上面的示例中使用了4种不同的表达式-[必需]、[字符串长度]、[范围]和[正则表达式] 您还可以选择定义自己的自定义验证属性并使用它们。您可以通过从System.ComponentModel.DataAnnotations命名空间中的ValidationAttribute基类派生来定义完全自定义的属性。或者,如果只想扩展现有验证属性的基本功能,则可以选择从这些属性派生 这就是我到目前为止所做的…我该从这里走到哪里 请注意,为了解决我的问题,我简化了这个过程,我意识到在现实生活中要检查重复的人对象,你需要做的不仅仅是检查名字和姓氏C# MVC2澄清中的自定义验证-以下是scott gu的示例,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,我正在尝试在我的asp.net mvc 2应用程序中实现数据验证,下面是scott gu的精彩文章: 我现在需要的不仅仅是所需的基本验证、范围、字符串长度 我想实现一个重复的检查器,但不幸的是,他的帖子开始丢失自定义验证部分的详细信息 见: 步骤4:创建自定义[电子邮件]验证属性 .NET Framework中的System.ComponentModel.DataAnnotations命名空间包含许多可以使用的内置验证属性。我们在上面的示例中使用了4种不同的表达式-[必需]、[字符串长度]、[范
[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;
}
}
在SoC分离关注点之后,您不应该在模型上进行此类验证,而应该在控制器上进行此类验证。以下是我用来在用户注册中强制执行唯一电子邮件的方法: [AttributeUsageAttributeTargets.Field | AttributeTargets.Property,AllowMultiple=false,Inherited=true] 公共类UniqueEmailAttribute:ValidationAttribute { 公共单属性 :base已获取“{0}”的值 { } }
这里唯一不能合理解释的是修饰DataRepository属性的[Inject]属性。它由nInject库提供,作为执行依赖项注入控制反转的一种方法,这样我就可以将数据库访问与应用程序分离。但是在合并DI之前,我只是让属性创建了具体DataRepository对象的实例,并使用了该属性,这当然不是好的做法,这就是我选择nInject路线的原因。我将从ValidationAttribute中提供哪些覆盖开始?我倾向于只使用自定义验证,因为在同一个类上使用验证方法是非常精确的。这绝对没有帮助,我还发现Scott Guth编写反对最佳实践的教程很奇怪。。。如果应该在控制器中执行,您仍然没有回答我的问题,也没有提供关于如何实现的任何信息。我的意思是,您的模型和属性都不应该知道潜在的持久性。不要忘记,博客文章中的示例并不是为了简单而遵循最佳实践。我想说的是,您应该通过查询持久性层来确保控制器上没有重复项。
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; }