【问题标题】:ASP.NET MVC : Model ─ Adding custom ValidationAttributeASP.NET MVC : Model ─ 添加自定义 ValidationAttribute
【发布时间】:2017-10-19 01:50:34
【问题描述】:

美好的一天!,当我添加一个我刚刚从 Walter Verhoeven 先生的 This stackoverflow 回答中复制的自定义 ValidationAttribute 时,我遇到了麻烦。

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

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

其中当然会给出“对象引用未设置为对象的实例”的错误,因为“值”为空。

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

-感谢您的阅读。

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

根据我对 Coding And 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;
    }

感谢你们提出我这个愚蠢的问题。

【问题讨论】:

  • 尝试使用直接返回值添加空检查,例如if (value == null) return false;,因此当值为 null 或为空时,value.ToString() 永远不会执行。
  • 感谢山本君的快速回复,我明白你的意思,也想到了那种解决方案,但是问题是它覆盖了其他属性,如果我要添加另一个属性呢让我们说 StringLength,然后将 RegularExpression 转换为另一种数据类型,让我们说带有这个自定义 ValidationAttribute 的 int,然后在 (ModelState.IsValid) 上,其他属性会起作用吗?对不起我的问题。我完全不知道
  • 你想像这样组合它们:[Required][StringLength(20)][MinimumAge(18)][RegularExpression("regex_pattern_here")] public DateTime birthdate { get; set; }?我认为这些属性不会被自定义属性覆盖(您可以在同一属性上同时拥有 StringLengthRegularExpression)。
  • 您甚至不需要您的 [Required] 属性 - 该属性是 DateTime (不可为空),因此默认情况下需要它。你应该检查 value 是否是 null 让异常发生并捕获它。
  • 请将您的答案作为答案添加到问题中并将其标记为已接受,以便其他人可以看到此问题已得到解决。只要对他人有帮助,就没有愚蠢的问题。

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


【解决方案1】:

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

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

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

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

感谢你们提出我这个愚蠢的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2012-09-13
    • 2012-05-05
    相关资源
    最近更新 更多