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

时间:2017-10-19 01:50:34

标签: c# asp.net asp.net-mvc asp.net-mvc-4 model

美好的一天!,我在自定义ValidationAttribute时遇到问题,当我添加一个我刚从This stackoverflow回复Walter Verhoeven时复制的那个。

我的问题是[必需]属性被覆盖或忽略,我不知道这个并尝试搜索解决方案但无济于事或者我可能没想过要搜索的正确关键字,无论如何这里是我的示例代码

模型

[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岁的魅力,但是如果没有输入(或为null),[Required]属性不会触发或工作,而是转到

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

当然它会给出错误#34;对象引用没有设置为对象的实例&#34;,因为&#39;值&#39;是空的。

基本上我想让两个属性协同工作。我错过了什么?

- 谢谢你的阅读。

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

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

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

[必需]属性触发,但由于自定义属性发生错误,[必需]属性响应被忽略,因此解决方案是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;
    }

谢谢你们接受我这个愚蠢的问题。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

所以基本上,我只需检查'对象值',如果它有一个值,如果没有,我们只能返回false,有很多方法可以检查并返回一个,所以我就是这样做的。然后,[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;
}

谢谢你们接受我这个愚蠢的问题。