繁体   English   中英

MVC2澄清中的自定义验证-以scott gu的示例为例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM