Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC 4.5的最小年龄检查自定义验证_C#_Asp.net Mvc - Fatal编程技术网

C# MVC 4.5的最小年龄检查自定义验证

C# MVC 4.5的最小年龄检查自定义验证,c#,asp.net-mvc,C#,Asp.net Mvc,我需要一些关于使用我自己的自定义数据注释对MVC4.5进行自定义验证的建议 我在注册网站时验证某人的年龄 我需要将这些字段作为字段传递给验证器 (date) date of birth (date)event start date (int)min age value 我将最小年龄和事件开始日期存储在web.config中。因此,这可以很容易地定制。 如果用户在检查事件日期时年龄不够大,则无法注册 我该怎么做呢?我查了一些例子,但我似乎无法理解 谢谢…您可以通过实现IValidatableOb

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

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

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

(date) date of birth
(date)event start date
(int)min age value
我将最小年龄和事件开始日期存储在web.config中。因此,这可以很容易地定制。 如果用户在检查事件日期时年龄不够大,则无法注册

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


谢谢…

您可以通过实现IValidatableObject接口,然后使用Validate方法进行自定义验证。支票“”

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


如果需要自定义客户端验证,请尝试实现IClientValidable和ValidationAttribute

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

创建您自己的验证属性是一条很容易实现的道路。要创建一个,您只需要创建一个实现
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

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

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


我建议使用流畅的验证,因为您可以创建更好的验证场景

一个.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;
    }
}
[AttributeUsage(AttributeTargets.Property)]
公共类MinAgeAttribute:ValidationAttribute
{
私有只读整数限制;
私有只读字符串_messageFormat;
/// 
///建造师
/// 
/// 
/// 
公共MinAgeAttribute(整数限制,字符串messageFormat=null)
{
_极限=极限;
_messageFormat=messageFormat;
}
/// 
///检查是否有效
/// 
/// 
/// 
/// 
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
var bDay=DateTime.Parse(value.ToString());
var today=DateTime.today;
var age=今天.Year-bDay.Year;
如果(b天>今天。添加年份(-年龄))
{
年龄--;
}
如果(年龄>=\u限制)返回空值;
var message=\u messageFormat.IsNullOrEmpty()?“对不起,您还不够大”:string.Format(\u messageFormat,\u limit);
var结果=新的ValidationResult(消息);
返回结果;
}
}

我希望推荐此功能的人指出,它不支持客户端验证。它不支持,这可能是一个大问题。@MystereMan:我同意它不支持客户端验证。但是,最好有一个服务器端验证。以防您在Web服务调用中使用相同的方法。如果需要自定义客户端验证,请尝试实现IClientValidatable@ARS我想说,客户端验证只是您可以添加的额外内容。好吧,这会减少流量,因为您不会向服务器发送空表单,但服务器端验证是为了真正的验证。@ARS-您似乎不明白。无法使用IValidatableObject执行客户端验证。您不能只实现IClientValidable,您需要使用全属性方法来获得客户端验证,因此您的建议不起作用。此外,您似乎误解了客户端验证并不意味着您没有服务器端验证。客户端发生在服务器端之外,所以提到这一点是毫无意义的,无论您是否有客户端,服务器端始终存在。@MystereMan:我认为您没有正确阅读我的响应。我猜您错过了IValidatableObject只进行服务器端验证的要点。此外,响应还建议使用ValidationAttribute和IClientValidatable生成一个完整的属性来进行验证。最后,我认为在提到客户端验证和服务器端验证时并没有什么意义。当你清楚地陈述你的观点时总是有帮助的。