ASP.NET MVC:模型 ─ 添加自定义 ValidationAttribute

ASP.NET MVC : Model ─ Adding custom ValidationAttribute

美好的一天!我在使用自定义 ValidationAttribute 时遇到了问题,当我添加一个刚从 This Whosebug answer by Mr. Walter Verhoeven 复制的属性时。

我的问题是 [Required] 属性被覆盖或忽略了,我对此一无所知并尝试搜索解决方案但无济于事,或者我可能没有想到要搜索的正确关键字,无论如何这是我的示例代码

型号

[Required]
[MinimumAge(18, ErrorMessage = "must be 18 years old or up")]    
[Display(Name = "Birth date")]
public DateTime birthdate { get; set; }

对于新的 ValidationAttribute

public class MinimumAgeAttribute : ValidationAttribute
{
    int _minimumAge;

    public MinimumAgeAttribute(int minimumAge)
    {
        _minimumAge = minimumAge;
    }

    public override bool IsValid(object value)
    {
        DateTime date;
        if (DateTime.TryParse(value.ToString(), out date))
        {
            return date.AddYears(_minimumAge) < DateTime.Now;
        }

        return false;
    }
}

自定义 ValidationAttribute 就像一个魅力,用于验证其 18 岁,但是如果没有输入(或空),[Required] 属性不会触发或工作,而是转到

if (DateTime.TryParse(value.ToString(), out date))

其中当然给出了 "Object reference not set to an instance of an object" 的错误,因为 'value' 为空。

所以基本上我想让这两个属性一起工作。我想念什么?

-感谢您的阅读。

──────────────────────────────────────────── ──────

根据我对 Coding 和 Testuya 的解释的理解

──────────────────────────────────────────── ──────

[Required] 属性触发,但由于自定义属性发生错误,[Required] 属性响应被忽略,因此解决方案是 Tetsuya 的第一个回复和 Coding

的附议
    public override bool IsValid(object value)
    {
        DateTime date;
        try
        {
            if (DateTime.TryParse(value.ToString(), out date))
                return date.AddYears(_minimumAge) < DateTime.Now;
        }
        catch (Exception) {  }

        return false;
    }

谢谢你们回答我这个愚蠢的问题。

──────────────────────────────────────────── ──────

根据我对 Coding 和 Testuya 的解释的理解

──────────────────────────────────────────── ──────

[Required] 属性触发,但由于自定义属性发生错误,[Required] 属性响应被忽略,因此解决方案是 Tetsuya 的第一个回复并由 Coding 附议。

所以基本上,我只需要检查 'object value' 是否有值,如果 none 我们可以 return false,有很多方法可以检查和return 以下是我的做法。然后 [Required] 属性给出对 ValidationMessage 的响应,因为自定义属性不处理我们的值对象变量的空值。

public override bool IsValid(object value)
{
    DateTime date;
    try
    {
        if (DateTime.TryParse(value.ToString(), out date))
            return date.AddYears(_minimumAge) < DateTime.Now;
    }
    catch (Exception) {  }

    return false;
}

谢谢你们回答我这个愚蠢的问题。