Aspnetcore: IValidatableObject.Validate рдХреЗрд╡рд▓ рддрднреА рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд┐рд╢реЗрд╖рддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 11 рдЬрдире░ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dotnet/aspnetcore

рдирдорд╕реНрддреЗ,

рдореИрдВ рдПрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рд╣реИ [Required] -decorated рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдХрд┐ рд▓рд╛рдЧреВ IValidatableObject ред рдореЙрдбрд▓ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдкрддреНрддрд┐ рд╢реВрдиреНрдп рд╣реИ, рддреЛ рд╡рд╕реНрддреБ рдХреА Validate() рд╡рд┐рдзрд┐ рдХреЛ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ Validate() рдХреЗрд╡рд▓ рддрднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд┐рд╢реЗрд╖рддрд╛-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╕рддреНрдпрд╛рдкрди рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ?

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкреНрд░рдкрддреНрд░ рд╕рдмрдорд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдкрд╣рд▓реЗ рдЕрдиреБрдкрд▓рдмреНрдз рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рджреЗрдЦрддреЗ рд╣реИрдВред рдлрд┐рд░, рдПрдХ рдмрд╛рд░ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдиреЗ рдФрд░ рдлрд╝реЙрд░реНрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕ рдмрд╛рд░, Validate() рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рддред рдХреНрдпрд╛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ _all_ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬрдм рд╡реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд░рддреЗ рд╣реИрдВ?

рдзрдиреНрдпрд╡рд╛рдж,
рдмреЗрди

рд╕рдВрд╕реНрдХрд░рдг: ASP.Net рдХреЛрд░ 1.1.0/.Net 4.6.1

рдЙрджрд╛рд╣рд░рдг рдХреЛрдб

public class Import : IValidatableObject
{
  [Required]
  public IFormFile File { get; set; }

  public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { /* ... */ }
  //...
}

_рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ:_

[HttpPost, ActionName("Index")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> IndexPost()
{
  var model = new ViewModels.Import();

  var bindingResult = await TryUpdateModelAsync(model, "", i => i.StartDate, i => i.EndDate, i => i.ImportTypeId, i => i.File);
  if (!bindingResult || ModelState.ValidationState != ModelValidationState.Valid) {
    return View(model);
  }

  // ...
}

рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ Validate() рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ 3 рдорд╣реАрдиреЗ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдЧрд░ рдЗрд╕рд╕реЗ рдХреЛрдИ рдЕрд╕реБрд╡рд┐рдзрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рд╣рдо рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЕрджреНрдпрддрди рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рд▓реЙрдЧ рдХрд░реЗрдВ рдФрд░ рд╣рдо рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред

рдореИрдВ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрднрд╡ Asp.Net Core 2.0 рдореЗрдВ рднреА рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрднрд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ IValidatableObject рд▓рдХреНрд╖реНрдпреАрдХрд░рдг .Net Standard 2.0 рд╣реИред
рдпрд╣ рддрдм рддрдХ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рд╕рднреА [Required] рд╕рддреНрдпрд╛рдкрди рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ Validate() рдореЗрдВ рдХрд╕реНрдЯрдо рд╕рддреНрдпрд╛рдкрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореЙрдбрд▓рд╕реНрдЯреЗрдЯ рдореЗрдВ рдХреБрдЫ рдФрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
modelstate рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫред рдореИрдВрдиреЗ рдЕрдиреНрдп рдорд╛рдирдХ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдЬреИрд╕реЗ [StringLength()] рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╖реНрдЯрдкреНрд░рдж рдмрдЧ рд╣реИред рдЗрд╕реЗ рдХреНрдпреЛрдВ рдмрдВрдж рдХрд░реЗрдВ?

рдЪреАрдЬреЛрдВ рдХреЛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЯ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк IValidatableObject рдкрд╛рддреЗ рд╣реИрдВред рдКрдкрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╛рдиреНрдп рдХрд░реЗрдВред рдпрд╣ рдПрдХ рдореБрджреНрджрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рдмреАрдЪ рдореБрдЭреЗ рдРрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╣реИ:
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╕реВрдЪреАValidateUpdateDates (ICommand рдХрдорд╛рдВрдб)
{
рд╡рд░ newErrors = рдирдИ рд╕реВрдЪреА();

        var validator = new DataAnnotationsValidator();
        var results = new List<ValidationResult>();
        var isValid = validator.TryValidate(command, out results);

        if (!(command is UpdatePromotionCommand cpc))
            return newErrors;

        newErrors.AddRange(ValidateDatesAreValidFormat(cpc));

        if (
          !string.IsNullOrEmpty(cpc.PurchasePeriodStart)
          && !string.IsNullOrEmpty(cpc.PurchasePeriodEnd)
          && DateTime.TryParse(cpc.PurchasePeriodStart, out DateTime purchasePeriodStartDate)
          && DateTime.TryParse(cpc.PurchasePeriodEnd, out DateTime purchasePeriodEndDate)
          && purchasePeriodStartDate > purchasePeriodEndDate
        )
        {
            newErrors.Add(new ECError("Purchase Period End cannot be before Purchase Period Start."));
        }

        if (
          !string.IsNullOrEmpty(cpc.ClaimPeriodStart)
          && !string.IsNullOrEmpty(cpc.ClaimPeriodEnd)
          && DateTime.TryParse(cpc.ClaimPeriodStart, out DateTime claimPeriodStartDate)
          && DateTime.TryParse(cpc.ClaimPeriodEnd, out DateTime claimPeriodEndDate)
          && claimPeriodStartDate > claimPeriodEndDate
        )
        {
            newErrors.Add(new ECError("Claim Period End cannot be before Claim Period Start."));
        }
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

TanvirArjel picture TanvirArjel  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BrennanConroy picture BrennanConroy  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mj1856 picture mj1856  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

UweKeim picture UweKeim  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

markrendle picture markrendle  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ