我正在使用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
的值。
谢谢!
答案 0 :(得分:1)
抱怨在属性定义中使用模型属性。相反,在您的自定义属性中,您可以使用ValidationContext类上的属性来获取基础模型,我想通过validationContext.ObjectInstance
。
显然,您不想对模型类型进行硬编码,但您可以使用反射:
bool goldTime;
var prop = validationContext.ObjectInstance.GetType().GetProperty("GoldTime");
if (prop != null)
goldTime = (bool)prop.GetValue(validationContext.ObjectInstance, null);
或者,为模型定义一个接口:
public interface ITimeModel
{
bool GoldTime { get; set; }
}
寻找:
bool goldTime;
if (validationContext.ObjectInstance is ITimeModel)
goldTime = ((ITimeModel)validationContext.ObjectInstance).GoldTime;