gpt4 book ai didi

c# - 自定义验证属性 : Comparing two properties in the same model

转载 作者:可可西里 更新时间:2023-11-01 03:12:15 25 4
gpt4 key购买 nike

有没有一种方法可以在 ASP.NET Core 中创建自定义属性,以使用 ValidationAttribute 验证一个日期属性是否小于模型中的其他日期属性。

假设我有这个:

public class MyViewModel 
{
[Required]
[CompareDates]
public DateTime StartDate { get; set; }

[Required]
public DateTime EndDate { get; set; } = DateTime.Parse("3000-01-01");
}

我正在尝试使用这样的东西:

    public class CompareDates : ValidationAttribute
{
public CompareDates()
: base("") { }

public override bool IsValid(object value)
{
return base.IsValid(value);
}

}

我发现其他建议使用另一个库的 SO 帖子,但如果可行的话,我更愿意坚持使用 ValidationAttribute。

最佳答案

您可以创建自定义验证属性来比较两个属性。这是服务器端验证:

public class MyViewModel
{
[DateLessThan("End", ErrorMessage = "Not valid")]
public DateTime Begin { get; set; }

public DateTime End { get; set; }
}

public class DateLessThanAttribute : ValidationAttribute
{
private readonly string _comparisonProperty;

public DateLessThanAttribute(string comparisonProperty)
{
_comparisonProperty = comparisonProperty;
}

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
ErrorMessage = ErrorMessageString;
var currentValue = (DateTime)value;

var property = validationContext.ObjectType.GetProperty(_comparisonProperty);

if (property == null)
throw new ArgumentException("Property with this name not found");

var comparisonValue = (DateTime)property.GetValue(validationContext.ObjectInstance);

if (currentValue > comparisonValue)
return new ValidationResult(ErrorMessage);

return ValidationResult.Success;
}
}

更新:如果您需要对此属性进行客户端验证,则需要实现一个 IClientModelValidator 接口(interface):

public class DateLessThanAttribute : ValidationAttribute, IClientModelValidator
{
...
public void AddValidation(ClientModelValidationContext context)
{
var error = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
context.Attributes.Add("data-val", "true");
context.Attributes.Add("data-val-error", error);
}
}

AddValidation 方法会将属性添加到来自 context.Attributes 的输入中。

enter image description here

您可以在此处阅读更多信息 IClientModelValidator

关于c# - 自定义验证属性 : Comparing two properties in the same model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41900485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com