【问题标题】:asp mvc validation specific to controllers action?特定于控制器操作的asp mvc验证?
【发布时间】:2010-06-27 03:01:44
【问题描述】:

内置的 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;
            }
        }
    }

【问题讨论】:

    标签: asp.net-mvc validation


    【解决方案1】:

    您正在验证的是业务规则。

    No two users can have the same username.
    

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

    【讨论】:

    • 你也许是对的......我想我把属性验证的整个点都搞错了......无论如何,谢谢你的提醒......
    【解决方案2】:

    如果一个类具有确定验证的属性,我不明白如何做到这一点。这显然适用于大多数项目,但对我来说这也行不通。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多