gpt4 book ai didi

c# - 当继承类的基类也有验证时,如何对继承类的模型进行验证?

转载 作者:行者123 更新时间:2023-12-05 01:41:40 25 4
gpt4 key购买 nike

好吧,我的问题是我正在使用 aspnetcore 2.1 创建一个 api,为了避免代码重复,我创建了一个抽象类,它具有共享 dto 的属性(board、boardforcreation、boardforupdate 等)。我使用 validatableobject 添加到抽象类个性化验证,现在,我想向派生自抽象类的类添加个性化验证,但它告诉我从 validatableobject 接口(interface)扩展是多余的,因为它已经在基类中声明,并且当我在派生类中添加 Validate 方法时,它告诉我它已经声明并实现了,那么,我如何使用 validatableobject 在抽象类和派生类中添加验证?还是有另一种方法来实现这一目标。提前谢谢你。

public class Board : BoardAbstractBase, IValidatableObject
{
public Guid BoardId { get; set; }

public DateTimeOffset StartDate { get; set; }

public DateTimeOffset EndDate { get; set; }
}

public abstract class BoardAbstractBase : AbstractBasicEntity, IValidatableObject
{
public DateTimeOffset EstimatedStartDate { get; set; }


public DateTimeOffset EstimatedEndDate { get; set; }


public decimal EstimatedBudget { get; set; }

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!(EstimatedStartDate < EstimatedEndDate))
yield return new ValidationResult(
"StartDateBeforeEndDate|The estimated start date should be smaller than the end date.",
new[] {"BoardAbstractBase"});
}
}

最佳答案

向您的基类添加一个虚拟方法。

如果您想在基类中执行一些常见的验证逻辑,并在每个具体实现中执行额外的验证逻辑,则向您的基类添加一个在基类验证函数中调用的虚拟验证方法。

添加到你的基类:

public abstract class BoardAbstractBase {
...
protected virtual bool RepoValidate() {
return true;
}
...
}

然后在每个具体实现中使用您需要的任何自定义验证逻辑实现 RepoValidate 作为 protected override bool RepoValidate() {...}

例如

public class Board : BoardAbstractBase, IValidatableObject
{
...
protected override bool RepoValidate() {
return this.BoardId == "";
}
...
}

然后在 BoardAbstractBase.Validate 中:

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!(EstimatedStartDate < EstimatedEndDate))
yield return new ValidationResult(
"StartDateBeforeEndDate|The estimated start date should be smaller than the end date.",
new[] {"BoardAbstractBase"});

if (!this.RepoValidate()){ ... }
}

现在,您始终可以修改 RepoValidate 以在验证失败时返回验证结果,或者采用任何参数,但为了举例,这个只返回 false。此外,因为它是 virtual 而不是 abstract,所以您只需在需要执行额外的自定义逻辑时覆盖它。

关于c# - 当继承类的基类也有验证时,如何对继承类的模型进行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54064308/

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