Aspnetcore: IValidatableObject.ValidateλŠ” νŠΉμ„± μ •μ˜ μœ νš¨μ„± 검사 κ·œμΉ™μ„ ν†΅κ³Όν•œ κ²½μš°μ—λ§Œ ν˜ΈμΆœλ©λ‹ˆκΉŒ?

에 λ§Œλ“  2017λ…„ 01μ›” 11일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: dotnet/aspnetcore

μ•ˆλ…•ν•˜μ„Έμš”,

IValidatableObject λ₯Ό κ΅¬ν˜„ν•˜λŠ” [Required] -decorated 속성이 μžˆλŠ” κ°œμ²΄κ°€ μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λΈ 바인딩 쀑에 ν•„μˆ˜ 속성이 null이면 개체의 Validate() λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Validate() λŠ” 속성 ꡬ성 μœ νš¨μ„± 검사λ₯Ό ν†΅κ³Όν•œ κ²½μš°μ—λ§Œ ν˜ΈμΆœλ©λ‹ˆκΉŒ?

ν•„μžμ˜ 경우 μ‚¬μš©μžκ°€ μœ νš¨μ„± 검사 였λ₯˜κ°€ μžˆλŠ” 양식을 μ œμΆœν•˜λ©΄ λ¨Όμ € λˆ„λ½λœ ν•„λ“œμ— λŒ€ν•œ λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. 그런 λ‹€μŒ ν•΄λ‹Ή 였λ₯˜κ°€ ν•΄κ²°λ˜κ³  양식을 λ‹€μ‹œ μ œμΆœν•˜λ©΄ Validate() μ—μ„œ μƒμ„±ν•œ μΆ”κ°€ 였λ₯˜ λͺ©λ‘μ΄ ν‘œμ‹œλ©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 양식을 처음 μ œμΆœν•  λ•Œ μ£Όμ˜κ°€ ν•„μš”ν•œ _λͺ¨λ“ _ 였λ₯˜ λͺ©λ‘μ΄ ν‘œμ‹œλ˜λ„λ‘ λͺ¨λ“  μœ νš¨μ„± 검사가 λ™μ‹œμ— λ°œμƒν•˜λ„λ‘ ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

감사 ν•΄μš”,
λ²€

버전: ASP.Net Core 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κ°œμ›” λ™μ•ˆ μ—…λ°μ΄νŠΈλ˜μ§€ μ•Šμ•„ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λΆˆνŽΈμ„ λ“œλ € μ£„μ†‘ν•©λ‹ˆλ‹€. 이 λ¬Έμ œκ°€ 계속 λ°œμƒν•˜λŠ” 경우 μ—…λ°μ΄νŠΈλœ μ •λ³΄λ‘œ μƒˆ 문제λ₯Ό 기둝해 μ£Όμ‹œλ©΄ μ‘°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

.Net Standard 2.0을 λŒ€μƒμœΌλ‘œ ν•˜λŠ” IValidatableObject ν¬ν•¨λœ μ°Έμ‘° λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν•¨κ»˜ Asp.Net Core 2.0μ—μ„œλ„ 이 λ™μž‘μ΄ λ°œμƒν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
그것은 λͺ¨λ‘κ°€ μ•„λ‹ˆλ‹€κΉŒμ§€μž…λ‹ˆλ‹€ [Required] κ²€μ¦μ΄μžˆλŠ” μ‚¬μš©μž μ •μ˜ 검증 λ§Œμ‘±ν•˜λŠ” Validate() μ‹€ν–‰λ©λ‹ˆλ‹€. λ‹€μ‹œ 말해, modelstateμ—μ„œ λ‹€λ₯Έ 것이 보고되기 전에 λͺ¨λ“  ν•„μˆ˜ ν•„λ“œμ™€ ν•¨κ»˜ 개체λ₯Ό μ»¨νŠΈλ‘€λŸ¬μ— κ²Œμ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.
modelstate λŠ” ν•„μˆ˜ ν•­λͺ©μ„ λ¨Όμ € μ²˜λ¦¬ν•œ λ‹€μŒ λ‹€λ₯Έ λͺ¨λ“  ν•­λͺ©μ„ μ²˜λ¦¬ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. [StringLength()] 와 같은 λ‹€λ₯Έ ν‘œμ€€ μœ νš¨μ„± 검사 속성을 μ‹œλ„ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

정말 μ§œμ¦λ‚˜λŠ” λ²„κ·Έμž…λ‹ˆλ‹€. μ™œ λ‹«μ•„?

사물을 μ„€κ³„ν•˜κ³  μ‚¬λžŒλ“€μ—κ²Œ 데이터 주석이 μž‘λ™ν•œλ‹€κ³  λ§ν•˜λŠ” 것은 μ–΄λ €μš΄ μΌμž…λ‹ˆλ‹€. 그러면 IValidatableObject.Validateκ°€ μœ„μ™€ 같이 μ‹€ν–‰λ©λ‹ˆλ‹€. 그것은 문제이고 이것은 λ‹€μ‹œ μ—΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.

ν•œνŽΈ λ‚˜λŠ” 이것이 쒋은 ν”„λ‘œκ·Έλž˜λ°μ΄λΌκ³  μƒκ°ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ¨Έλ₯Ό μƒλŒ€ν•΄μ•Ό ν•©λ‹ˆλ‹€.
곡개 정적 λͺ©λ‘ValidateUpdateDates(ICommand λͺ…λ Ή)
{
var 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 λ“±κΈ‰