asp mvc验证特定于控制器动作?

时间:2010-06-26 17:04:05

标签: asp.net-mvc validation

内置的ASP MVC验证是否可以针对同一控制器的不同操作采取不同的行为?例如,我有一个用户控制器,它具有创建,编辑和其他操作等操作。因此,在模型用户中,属性Username正在验证其唯一性。如果存在具有相同用户名的用户,则会抛出并且错误用户名已存在。因此,在编辑用户时使用相同的验证器进行编辑操作会引发错误“用户名已存在”。谁能告诉我是否有办法解决这个问题?我正在粘贴我的验证码以供参考。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;  

    namespace Models
    {
        [MetadataType(typeof(AdmiUserMetadata))]
        public partial class AdminUser
        {
            public class AdmiUserMetadata
            {
                [Required(ErrorMessage = "Required Field")]
                public string Id { get; set; }

                [Required(ErrorMessage = "Required Field")]
                [RegularExpression("[\\S]{6,}", ErrorMessage = "Must be at least 6 characters.")]
                [Username(ErrorMessage = "Username already taken")]
                public string Username { get; set; }

                [Required(ErrorMessage = "Required Field")]
                [RegularExpression("[\\S]{6,}", ErrorMessage = "Must be at least 6 characters.")]
                public string Password { get; set; }

                [Required(ErrorMessage = "Required Field")]
                public string Name { get; set; }

                [Required(ErrorMessage = "Required Field")]
                [RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$", ErrorMessage ="Invalid E-mail ID")]
                public string Email { get; set; }

                [Required(ErrorMessage = "Required Field")]
                [RegularExpression("(Active|Disabled)", ErrorMessage = "Select the status of User")]
                public string Status { get; set; }

                [Required(ErrorMessage = "Required Field")]
                [RegularExpression("^[1-9]", ErrorMessage = "Select the group of User")]
                public string Group { get; set; }
            }
        }

        public class UsernameAttribute : ValidationAttribute
        {
            IUserRepository _repository = new UserRepository();
            public override bool IsValid(object value)
            {
                if (value == null)  
                    return true;
                if (_repository.IsUsernamePresent((string)value))
                {
                    return false;
                }
                return true;
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

如果一个类具有确定验证的属性,我不知道如何做到这一点。这显然适用于大多数项目,但对我而言,这也没有成功。

如果您需要附加不同的验证规则集,请查看http://fluentvalidation.codeplex.com/。我尝试过并喜欢它。

它不处理客户端验证。我放弃了,因为我在大多数部分都有ajax调用,感觉有点像客户端验证。

答案 1 :(得分:0)

您要验证的是业务规则。

No two users can have the same username.

我会有一个用户服务,在创建/编辑时强制执行此规则。属性最适合输入验证。 (例如,整数是非负的?有效的电子邮件地址?等)