【发布时间】: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; }?我认为这些属性不会被自定义属性覆盖(您可以在同一属性上同时拥有StringLength和RegularExpression)。 -
您甚至不需要您的
[Required]属性 - 该属性是DateTime(不可为空),因此默认情况下需要它。你应该检查value是否是null让异常发生并捕获它。 -
请将您的答案作为答案添加到问题中并将其标记为已接受,以便其他人可以看到此问题已得到解决。只要对他人有帮助,就没有愚蠢的问题。
标签: c# asp.net asp.net-mvc asp.net-mvc-4 model