【发布时间】:2017-08-24 12:18:11
【问题描述】:
我正在使用 ASP.NET MVC,我想创建一个自定义验证属性来验证来自文本输入的 StartTime 和 EndTime。
我试过了:
型号:
public class MyModel
{
public bool GoldTime { get; set; }
[TimeValidation(@"^\d{1,2}:\d{1,2}$", GoldTime, ErrorMessage = "Start time is invalid.")]
public string StartTime { get; set; }
[TimeValidation(@"^\d{1,2}:\d{1,2}$", GoldTime, ErrorMessage = "End time is invalid.")]
public string EndTime { get; set; }
}
验证属性:
public class TimeValidationAttribute : ValidationAttribute
{
private readonly string _pattern;
private readonly bool _useGoldTime;
public TimeValidationAttribute(string pattern, bool useGoldTime)
{
_pattern = pattern;
_useGoldTime = useGoldTime;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (_useGoldTime)
{
var regex = new Regex(_pattern);
if (!regex.IsMatch(value.ToString()))
{
return new ValidationResult(ErrorMessage);
}
}
return ValidationResult.Success;
}
}
但我收到此错误消息:
非静态字段、方法或 属性“MyModel.GoldTime”
然后,我再次尝试将GoldTime(在模型中)更改为true,错误消息将消失。
所以,我的问题是:如何将参数GoldTime 传递给属性构造函数?我需要使用GoldTime 作为密钥来启用验证StartTime 和EndTime 的值。
谢谢!
【问题讨论】:
-
您的参数需要是其他属性的名称,而不是其他属性的实际值(并且在您的方法中使用反射来获取其他属性的值)。我建议阅读The Complete Guide To Validation In ASP.NET MVC 3 - Part 2 以了解如何创建自定义验证属性
-
附带说明,将
string用于似乎是日期或时间的属性是不合适的。而且您的正则表达式允许90:80我认为这也是无效的 -
@StephenMuecke 感谢您的链接和注释。我正在阅读文档。
-
您真正想在这里验证什么?如果值应该是您的属性名称所暗示的时间,那么您的属性应该是
TimeSpan,但不清楚GoldTime的含义 -
@StephenMuecke 我使用
GoldTime作为密钥,以确保用户需要使用StartTime和EndTime的黄金时间。否则,StartTime和EndTime将被忽略(无需更新到数据库)。
标签: c# asp.net asp.net-mvc