0

我需要一些关于使用我自己的自定义数据注释对 MVC 4.5 进行自定义验证的建议

我在注册网站时验证某人的年龄。

我要求将这些作为字段传递给验证器。

(date) date of birth
(date)event start date
(int)min age value

我将最小年龄和事件开始日期存储在 web.config 中。所以这可以很容易地定制。如果在查看活动日期时用户的年龄不够大,则他们无法注册。

我该怎么做呢?我已经检查了一些例子,但我似乎无法理解它。

谢谢...

4

5 回答 5

2

创建自己的验证属性是可行的方法并且很容易实现。要创建一个,您只需要创建一个实现的类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

于 2013-05-03T13:27:23.543 回答
0

您可以通过实现 IValidatableObject 接口然后使用 Validate 方法来进行自定义验证。勾选“使用 IValidatableObject 自定义验证

请注意 IValidatableObject 仅支持服务器端验证。在我看来,最好有一个服务器端验证。以防万一您在 Web 服务调用中使用相同的方法。

如果您想要自定义客户端验证,请尝试实现 IClientValidatable 和 ValidationAttribute

于 2013-05-03T13:11:19.133 回答
0

使用ValidationAttribute创建您自己的注释并将其装饰为所需的属性。您必须覆盖返回布尔值的Validate()方法。在此基础上,您可以执行您的操作

于 2013-05-03T13:15:52.443 回答
0

没有必要仅为年龄验证创建自定义属性。您需要做的就是创建一个自定义属性,从出生日期计算年龄,然后在年龄属性上添加一个正常范围验证属性,并具有最小年龄。

然而,问题是您在 web.config 中设置了最小年龄,并且属性是在编译时创建的,而不是在运行时创建的。

我建议使用 Fluent Validation,因为您可以创建更好的验证场景。

于 2013-05-03T14:10:11.083 回答
0

.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;
    }
}
于 2020-10-26T23:04:14.350 回答