Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC2澄清中的自定义验证-以下是scott gu的示例_C#_Asp.net Mvc_Validation - Fatal编程技术网

C# MVC2澄清中的自定义验证-以下是scott gu的示例

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种不同的表达式-[必需]、[字符串长度]、[范

我正在尝试在我的asp.net mvc 2应用程序中实现数据验证,下面是scott gu的精彩文章:

我现在需要的不仅仅是所需的基本验证、范围、字符串长度

我想实现一个重复的检查器,但不幸的是,他的帖子开始丢失自定义验证部分的详细信息

见:

步骤4:创建自定义[电子邮件]验证属性

.NET Framework中的System.ComponentModel.DataAnnotations命名空间包含许多可以使用的内置验证属性。我们在上面的示例中使用了4种不同的表达式-[必需]、[字符串长度]、[范围]和[正则表达式]

您还可以选择定义自己的自定义验证属性并使用它们。您可以通过从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;
    }
}

在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; }