【问题标题】:How to validate two properties with ASP.NET MVC 2如何使用 ASP.NET MVC 2 验证两个属性
【发布时间】:2010-03-15 20:21:48
【问题描述】:

我刚刚开始使用 ASP.NET MVC 2,并且正在玩 Validation。

假设我有 2 个属性:

  • 密码1
  • 密码2

并且我想要求它们都填写,并且要求它们都相同,然后模型才有效。

我有一个名为“NewUser”的简单类。

我将如何实现它?我已经阅读了有关 ValidationAttribute 的内容,并且理解这一点。但我不知道如何使用它来实现将两个或多个属性与 heathother 进行比较的验证。

提前致谢!

以下解决方案的问题

当这被应用到应用程序中,并且 ModelBinder 运行模型的验证时,那么一个问题:

如果 Property-level ValidationAttribute 包含错误,则 Class-level ValidationAttributeNOT 验证。到目前为止,我还没有找到解决这个问题的方法。

如果您对此问题有解决方案,请分享您的经验。非常感谢!

【问题讨论】:

    标签: asp.net-mvc validation asp.net-mvc-2 c#-3.0


    【解决方案1】:

    Visual Studio 的默认 ASP.NET MVC 2 模板包含您需要的确切验证属性。粘贴自AccountModels.cs 文件:

    [AttributeUsage(AttributeTargets.Class, 
        AllowMultiple = true, Inherited = true)]
    public sealed class PropertiesMustMatchAttribute : ValidationAttribute {
        private const string _defaultErrorMessage = 
            "'{0}' and '{1}' do not match.";
        private readonly object _typeId = new object();
    
        public PropertiesMustMatchAttribute(string originalProperty, 
            string confirmProperty)
            : base(_defaultErrorMessage) {
            OriginalProperty = originalProperty;
            ConfirmProperty = confirmProperty;
        }
    
        public string ConfirmProperty { get; private set; }
        public string OriginalProperty { get; private set; }
    
        public override object TypeId {
            get {
                return _typeId;
            }
        }
    
        public override string FormatErrorMessage(string name) {
            return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
                OriginalProperty, ConfirmProperty);
        }
    
        public override bool IsValid(object value) {
            PropertyDescriptorCollection properties = 
               TypeDescriptor.GetProperties(value);
            object originalValue = properties.Find(OriginalProperty, 
                true /* ignoreCase */).GetValue(value);
            object confirmValue = properties.Find(ConfirmProperty, 
                true /* ignoreCase */).GetValue(value);
            return Object.Equals(originalValue, confirmValue);
        }
    }
    

    使用方法:

    [PropertiesMustMatch("Password", "ConfirmPassword", 
        ErrorMessage = "The password and confirmation password do not match.")]
    class NewUser {
        [Required]
        [DataType(DataType.Password)]
        [DisplayName("Password")]
        public string Password { get; set; }
        [Required]
        [DataType(DataType.Password)]
        [DisplayName("Confirm password")]
        public string ConfirmPassword { get; set; }
    }
    

    【讨论】:

    • 我能看到的唯一问题是,当模型的两个属性(在这种情况下为类)不相等时,它并不表示特定的属性包含错误,就像它适用于 [Required] 和 m.Password1) %>
    • @CodeMonkey,我明白了。虽然我不确定是否有一个优雅的解决方案可以让它以另一种方式工作,使用模型绑定。毕竟,这在技术上是一个类级别的验证。如果您必须将错误添加到属性中,那么在绑定后检查控制器中的两个值可能是最快的解决方案(尽管不是最优雅的)。
    • 在 MVC 2 版本中,Html.ValidationSummary 辅助方法现在可以仅显示模型级错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多