簡體   English   中英

FluentValidation 以“AND”方式鏈接規則

[英]FluentValidation chaining rules in "AND" manner

創建了這個驗證:



 public ActivityValidator(IUserAccessor userAccessor)
        {
            var userId = userAccessor.GetUserIdFromAccessToken();

            RuleSet("CompleteHappeningAsync", () =>
                {
                    RuleFor(a => a.ActivityTypeId).IsHappening()
                    .WithState(x => new BadRequest("Aktivnost nije Događaj"))
                        .DependentRules(() =>
                        {
                            RuleFor(a => a.EndDate).LessThanOrEqualTo(DateTimeOffset.Now)
                            .WithState(x => new BadRequest("Događaj se još nije završio"))
                            .DependentRules(() =>
                            {
                                RuleFor(a => a.EndDate).GreaterThan(DateTimeOffset.Now.AddDays(-7))
                                .WithState(x => new BadRequest("Prošlo je nedelju dana od završetka Događaja"))
                                .DependentRules(() =>
                                {
                                    RuleFor(a => a.User.Id).Equal(userId)
                                    .WithState(x => new BadRequest("Ne možete završiti tuđi događaj"))
                                    .DependentRules(() =>
                                    {
                                        RuleFor(a => a.HappeningMedias).Empty()
                                        .WithState(x => new BadRequest("Već ste završili događaj"));
                                    });
                                });
                            });
                        });
                });
        }

如何使用When以推薦的方式重寫它?

CascadeMode 用於為一個屬性鏈接的規則,因此此處不能使用。

推薦方式——圖片取自官網

我找到了更好的方法,而不是使用When。 在 Startup.cs 中設置 cfg.ValidatorOptions.DefaultClassLevelCascadeMode = CascadeMode.Stop 然后你可以用“AND”的方式更好地編寫規則:

            RuleFor(a => a.ActivityTypeId).IsHappening();

            RuleFor(a => a.EndDate).LessThanOrEqualTo(DateTimeOffset.Now)
                .WithState(e => new BadRequest("Događaj se još nije završio"));

            RuleFor(a => a.EndDate).GreaterThan(DateTimeOffset.Now.AddDays(-7))
                .WithState(e => new BadRequest("Prošlo je nedelju dana od završetka Događaja"));

            RuleFor(a => a.User.Id).Equal(userId)
                .WithState(e => new BadRequest("Ne možete završiti tuđi događaj"));

            RuleFor(a => a.HappeningMedias).Empty()
                .WithState(e => new BadRequest("Već ste završili događaj"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM