μλ νμΈμ,
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κ°μ λμ μ λ°μ΄νΈλμ§ μμ μ’ λ£λμμ΅λλ€.
λΆνΈμ λλ € μ£μ‘ν©λλ€. μ΄ λ¬Έμ κ° κ³μ λ°μνλ κ²½μ° μ λ°μ΄νΈλ μ λ³΄λ‘ μ λ¬Έμ λ₯Ό κΈ°λ‘ν΄ μ£Όμλ©΄ μ‘°μ¬νκ² μ΅λλ€.
.Net Standard 2.0μ λμμΌλ‘ νλ IValidatableObject
ν¬ν¨λ μ°Έμ‘° λΌμ΄λΈλ¬λ¦¬μ ν¨κ» Asp.Net Core 2.0μμλ μ΄ λμμ΄ λ°μνκ³ μμ΅λλ€.
κ·Έκ²μ λͺ¨λκ° μλλ€κΉμ§μ
λλ€ [Required]
κ²μ¦μ΄μλ μ¬μ©μ μ μ κ²μ¦ λ§μ‘±νλ Validate()
μ€νλ©λλ€. λ€μ λ§ν΄, modelstateμμ λ€λ₯Έ κ²μ΄ λ³΄κ³ λκΈ° μ μ λͺ¨λ νμ νλμ ν¨κ» κ°μ²΄λ₯Ό 컨νΈλ‘€λ¬μ κ²μν΄μΌ ν©λλ€.
modelstate
λ νμ νλͺ©μ λ¨Όμ μ²λ¦¬ν λ€μ λ€λ₯Έ λͺ¨λ νλͺ©μ μ²λ¦¬νλ κ² κ°μ΅λλ€. [StringLength()]
μ κ°μ λ€λ₯Έ νμ€ μ ν¨μ± κ²μ¬ μμ±μ μλνμ§ μμμ΅λλ€.
μ λ§ μ§μ¦λλ λ²κ·Έμ λλ€. μ λ«μ?
μ¬λ¬Όμ μ€κ³νκ³ μ¬λλ€μκ² λ°μ΄ν° μ£Όμμ΄ μλνλ€κ³ λ§νλ κ²μ μ΄λ €μ΄ μΌμ λλ€. κ·Έλ¬λ©΄ IValidatableObject.Validateκ° μμ κ°μ΄ μ€νλ©λλ€. κ·Έκ²μ λ¬Έμ μ΄κ³ μ΄κ²μ λ€μ μ΄μ΄μΌ ν©λλ€.
ννΈ λλ μ΄κ²μ΄ μ’μ νλ‘κ·Έλλ°μ΄λΌκ³ μκ°νλ νλ‘κ·Έλλ¨Έλ₯Ό μλν΄μΌ ν©λλ€.
κ³΅κ° μ μ λͺ©λ‘
{
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."));
}