根据其他属性验证属性的最佳做法

克里斯多夫·布林

假设您有一个类似的课程:

public enum Kind { Kind1, Kind2 }
public class MyForm
{
    public string Kind { get; set; }
    public ACustomClass1 Custom1 { get; set; }
    public ACustomClass2 Custom2 { get; set; }
}

你想验证Custom1Custom1ValidatorKind == Kind1(和Custom2Custom2ValidatorKind == Kind2,很明显)

继续进行版本8.6.0的最佳方法是什么?

此刻,我已经完成了这样的工作(但我觉得很尴尬):

public class MyFormValidator : AbstractValidator<MyForm>
{
    public MyFormValidator (IStringLocalizer<Strings> localizer, Custom1Validator validator1, Custom2Validator validator2)
    {            
        //validate Kind and then, in function of Kind, use correct validator
        RuleFor(x => x).Custom((f, context) => {
            if (!Enum.TryParse<Kind>(f.Kind, out var kind))
            {
                context.AddFailure(localizer["Invalid Kind"]);
                return;
            }
            switch (kind)
            {
                case Kind.Kind1:
                    if (f.Custom1 == null)
                    {
                        context.AddFailure(localizer["Invalid Kind"]);
                    }
                    else if (! validator1.Validate(f.Custom1, out var firstError))
                    {
                        context.AddFailure(firstError);
                    }
                    break;
                case Kind.Kind2:
                    if (f.Custom2 == null)
                    {
                        context.AddFailure(localizer["Invalid Kind"]);
                    }
                    else if (!validator2.Validate(f.Custom2, out var firstError))
                    {
                        context.AddFailure(firstError);
                    }
                    break;
            }
        });
    }
}

请注意,我使用的是带有依赖项注入的asp.net核心(这就是为什么存在这种情况,IStringLocalizer而我不能SetValidator用于Custom1和Custom2)

相反,我想要的是

RuleFor(x => x.Kind).NotEmpty().IsEnumName(typeof(Kind)).withMessage(_ => localizer["Invalid Kind"]);
RuleFor(x => x.Custom1).NotEmptyWhen(f => f.Kind == Kind.Custom1.ToString()).withMessage(_ => localizer["Invalid Kind"])
RuleFor(x => x.Custom1).SetValidator(validator1); //would be executed only when custom1 is not null

//与custom2相同

问题是我看不到该NotEmptyWhen方法的编码方法

汤姆·法尔特塞克

重组?

通过您发布的代码片段的外观上来看,我相信这MyForm将永远不会有一个人口稠密Custom1并且Custom2在同一个请求属性。因此,我建议您不要直接使用表示要验证的有效负载的模型,而不要拥有同时包含两种有效负载类型的父模型这样一来,您就不会在需要的地方遇到这种讨厌的检查类型

您的一个表单端点接受Custom1一个与关联的Custom1Validator表单端点中的另一个端点接受Custom2带有关联的Custom2Validator它们是分离的。您可以安全地更改一个而不影响另一个。

使用流利的验证条件(何时/除非)

如果您沉迷于让一个模型负责代表多个请求的有效负载(请不要这么做),则可以使用When()库提供方法。看看他们关于条件规则的文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

RH属性的最佳做法

来自分类Dev

根据其他属性填充对象列表

来自分类Dev

根据其他属性返回的值设置属性

来自分类Dev

根据其他属性在bash脚本中提取XML属性

来自分类Dev

根据列表中的其他属性对属性求和

来自分类Dev

根据其他属性的存在来设置Maven属性

来自分类Dev

XSLT - 根据其他属性的值复制某些属性

来自分类Dev

hapijs joi验证,比从其他属性的总和验证更大

来自分类Dev

Objective-C属性赋予最佳做法

来自分类Dev

如何管理HTML元素属性,最佳做法

来自分类Dev

如何根据当前节点属性返回其他节点

来自分类Dev

根据选择表中的其他属性,不同的升序值

来自分类Dev

CSS根据内联类条件编写其他类属性

来自分类Dev

Symfony2验证程序对其他属性的约束大于

来自分类Dev

对类型为其他模型的属性进行环回验证

来自分类Dev

使用其他属性的值进行Python Eve验证

来自分类Dev

使用 allOf 和其他属性进行 Swagger 数据验证

来自分类Dev

依赖于其他参数的匹配参数的最佳做法

来自分类Dev

处理验证的最佳做法

来自分类Dev

Django验证最佳做法

来自分类Dev

根据数组突变事件和其他属性定义Polymer计算属性

来自分类Dev

根据其他属性更改下拉属性编辑器的项目?

来自分类Dev

Angular Directive属性包含其他属性

来自分类Dev

接口属性取决于其他属性

来自分类Dev

Angular Directive属性包含其他属性

来自分类Dev

从其他属性名称创建属性

来自分类Dev

依赖于其他属性的属性

来自分类Dev

设置图像尺寸的最佳做法是什么?CSS或属性?

来自分类Dev

C#最佳做法-从BLL设置只读模型属性值