我需要一些关于使用我自己的自定义数据注释对 MVC 4.5 进行自定义验证的建议
我在注册网站时验证某人的年龄。
我要求将这些作为字段传递给验证器。
(date) date of birth
(date)event start date
(int)min age value
我将最小年龄和事件开始日期存储在 web.config 中。所以这可以很容易地定制。如果在查看活动日期时用户的年龄不够大,则他们无法注册。
我该怎么做呢?我已经检查了一些例子,但我似乎无法理解它。
谢谢...
我需要一些关于使用我自己的自定义数据注释对 MVC 4.5 进行自定义验证的建议
我在注册网站时验证某人的年龄。
我要求将这些作为字段传递给验证器。
(date) date of birth
(date)event start date
(int)min age value
我将最小年龄和事件开始日期存储在 web.config 中。所以这可以很容易地定制。如果在查看活动日期时用户的年龄不够大,则他们无法注册。
我该怎么做呢?我已经检查了一些例子,但我似乎无法理解它。
谢谢...
创建自己的验证属性是可行的方法并且很容易实现。要创建一个,您只需要创建一个实现的类ValidationAttribute
例子
public class MinAgeAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// Do some validation checks here
var result = new ValidationResult("Sorry you are not old enough");
return result;
}
您重写该IsValid方法来执行您的验证逻辑,返回一个 ValidationResult
您可以通过实现 IValidatableObject 接口然后使用 Validate 方法来进行自定义验证。勾选“使用 IValidatableObject 自定义验证”
请注意 IValidatableObject 仅支持服务器端验证。在我看来,最好有一个服务器端验证。以防万一您在 Web 服务调用中使用相同的方法。
如果您想要自定义客户端验证,请尝试实现 IClientValidatable 和 ValidationAttribute
使用ValidationAttribute创建您自己的注释并将其装饰为所需的属性。您必须覆盖返回布尔值的Validate()方法。在此基础上,您可以执行您的操作
没有必要仅为年龄验证创建自定义属性。您需要做的就是创建一个自定义属性,从出生日期计算年龄,然后在年龄属性上添加一个正常范围验证属性,并具有最小年龄。
然而,问题是您在 web.config 中设置了最小年龄,并且属性是在编译时创建的,而不是在运行时创建的。
我建议使用 Fluent Validation,因为您可以创建更好的验证场景。
.net core 上的最小年龄检查属性示例用法:[MinAge(18)]
属性:
[AttributeUsage(AttributeTargets.Property)]
public class MinAgeAttribute : ValidationAttribute
{
private readonly int _limit;
private readonly string _messageFormat;
/// <summary>
/// Constructor
/// </summary>
/// <param name="limit"></param>
/// <param name="messageFormat"></param>
public MinAgeAttribute(int limit, string messageFormat = null)
{
_limit = limit;
_messageFormat = messageFormat;
}
/// <summary>
/// Check if valid
/// </summary>
/// <param name="value"></param>
/// <param name="validationContext"></param>
/// <returns></returns>
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var bDay = DateTime.Parse(value.ToString());
var today = DateTime.Today;
var age = today.Year - bDay.Year;
if (bDay > today.AddYears(-age))
{
age--;
}
if (age >= _limit) return null;
var message = _messageFormat.IsNullOrEmpty() ? "Sorry you are not old enough" : string.Format(_messageFormat, _limit);
var result = new ValidationResult(message);
return result;
}
}