C# 将ASP.NET Web服务中的验证属性与NHibernate一起使用

C# 将ASP.NET Web服务中的验证属性与NHibernate一起使用,c#,asp.net,.net,regex,nhibernate,C#,Asp.net,.net,Regex,Nhibernate,我只是在想,是否有什么快速而好的方法来验证我模型中的属性。我知道有像RegEx这样的东西,但有没有更简单的选择 例如: 我的用户模型: namespace Models { public class Users : EntityBase { public virtual string Username { get; set; } public virtual string Password { get; set; } public

我只是在想,是否有什么快速而好的方法来验证我模型中的属性。我知道有像RegEx这样的东西,但有没有更简单的选择

例如:

我的用户模型:

namespace Models
{
    public class Users : EntityBase
    {
        public virtual string Username { get; set; }
        public virtual string Password { get; set; }
        public virtual Role Role { get; set; }
    }
}
EntityBase:(在所有模型中继承的一个guid属性)

在我的情况下,如何对WebService.cs文件执行验证

public class LambdAlarmWebService : WebService
{
    [WebMethod(EnableSession = true)]
        public HttpStatusCode Login(string username, string password)
        {
            var factory = SessionFactory.Instance;
            var session = factory.OpenSession();
            var result = session.QueryOver<Users>().List<Users>();
            var user = result.FirstOrDefault(u => u.Username.ToUpper() == username.ToUpper());

            if (user != null && (username.ToUpper() == user.Username.ToUpper() && password == user.Password))
            {
                Session["Role"] = user.Role.Name;
                Session["UserId"] = user.Id;

                return HttpStatusCode.Accepted;
            }

            return HttpStatusCode.NotFound;
        }
}
公共类LambdAlarmWebService:WebService
{
[WebMethod(EnableSession=true)]
公共HttpStatusCode登录(字符串用户名、字符串密码)
{
var factory=SessionFactory.Instance;
var session=factory.OpenSession();
var result=session.QueryOver().List();
var user=result.FirstOrDefault(u=>u.Username.ToUpper()==Username.ToUpper());
if(user!=null&&(username.ToUpper()==user.username.ToUpper()&&password==user.password))
{
会话[“角色”]=user.Role.Name;
会话[“UserId”]=user.Id;
返回HttpStatusCode。已接受;
}
返回HttpStatusCode.NotFound;
}
}
因此,如果我希望用户名至少包含3个字符,并且只包含字母数字符号(no!%&),我应该怎么做呢?

我们正在使用(部分.NET)。它在MVC中广泛使用,但它是独立的程序集(=没有MVC依赖项)

对于您的用户名,您可以使用

namespace Models
{
    using System;
    using System.ComponentModel.DataAnnotations;

    public class EntityBase
    {
        public virtual Guid Id { get; set; }
    }

    public class Users : EntityBase
    {
        [Required]
        [MinLength(3)]
        [RegularExpression(@"^[a-zA-Z0-9]*$")]
        public virtual string Username { get; set; }
        // rest of entity
    }

    [TestFixture]
    public class ValidationTest 
    {
        [Test]
        public void Username_MustBeAlphanumeric()
        {
            var user = new Users()
            {
                Id = Guid.NewGuid(),
                Username = "R_",
                Password = "secret"
            };

            // Althernative throws exception: 
            // Validator.ValidateObject(user, new ValidationContext(user), true);

            var errors = new List<ValidationResult>();
            var ok = Validator.TryValidateObject(user, new ValidationContext(user), errors, true);

            Console.WriteLine("OK: {0}", ok);
            foreach (var error in errors)
            {
                Console.WriteLine("Error '{0}' for members {1}", error.ErrorMessage, string.Join(", ", error.MemberNames));
            }
        }
    }
}
命名空间模型
{
使用制度;
使用System.ComponentModel.DataAnnotations;
公共类实体库
{
公共虚拟Guid Id{get;set;}
}
公共类用户:EntityBase
{
[必需]
[第(3)款]
[正则表达式(@“^[a-zA-Z0-9]*$”)
公共虚拟字符串用户名{get;set;}
//实体的其余部分
}
[测试夹具]
公共类验证测试
{
[测试]
public void Username_MustBeAlphanumeric()
{
var user=新用户()
{
Id=Guid.NewGuid(),
Username=“R_”,
Password=“secret”
};
//Althernative引发异常:
//Validator.ValidateObject(用户,新的ValidationContext(用户),true);
var errors=新列表();
var ok=Validator.TryValidateObject(用户,新的ValidationContext(用户),错误,true);
WriteLine(“OK:{0}”,OK);
foreach(错误中的var错误)
{
WriteLine({1}成员的错误'{0}',Error.ErrorMessage,string.Join(“,”,Error.MemberNames));
}
}
}
}
旁注:我们正在验证模型,而不是实体

您只能使用正则表达式进行字母数字检查,但您可以编写自定义属性

namespace Models
{
    using System;
    using System.ComponentModel.DataAnnotations;

    public class EntityBase
    {
        public virtual Guid Id { get; set; }
    }

    public class Users : EntityBase
    {
        [Required]
        [MinLength(3)]
        [RegularExpression(@"^[a-zA-Z0-9]*$")]
        public virtual string Username { get; set; }
        // rest of entity
    }

    [TestFixture]
    public class ValidationTest 
    {
        [Test]
        public void Username_MustBeAlphanumeric()
        {
            var user = new Users()
            {
                Id = Guid.NewGuid(),
                Username = "R_",
                Password = "secret"
            };

            // Althernative throws exception: 
            // Validator.ValidateObject(user, new ValidationContext(user), true);

            var errors = new List<ValidationResult>();
            var ok = Validator.TryValidateObject(user, new ValidationContext(user), errors, true);

            Console.WriteLine("OK: {0}", ok);
            foreach (var error in errors)
            {
                Console.WriteLine("Error '{0}' for members {1}", error.ErrorMessage, string.Join(", ", error.MemberNames));
            }
        }
    }
}