c# - 유효성 - remote validation




날짜에 대한 MVC 모델 유효성 검사 (3)

System.ComponentModel.DataAnnotations의 IValidatableObject 인터페이스로이 작업을 수행 할 수 있습니다.이 인터페이스를 사용하면 더 많은 검사를 수행 할 수있는 추가 유효성 검사 규칙을 추가 할 수 있습니다. 클래스에 인터페이스를 추가 한 다음, 현재 날짜 / 시간과 StartDateTime을 비교할 수있는 Validate 메서드를 구현하고 EndDateTime과 StartDateTime을 비교합니다.

public class MyClass : IValidatableObject
{               
    [Required(ErrorMessage="Start date and time cannot be empty")]
    //validate:Must be greater than current date
    [DataType(DataType.DateTime)]
    public DateTime StartDateTime { get; set; }

    [Required(ErrorMessage="End date and time cannot be empty")]
    //validate:must be greater than StartDate
    [DataType(DataType.DateTime)]
    public DateTime EndDateTime { get; set; }       

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        List<ValidationResult> results = new List<ValidationResult>();

        if (StartDateTime < DateTime.Now)
        {
            results.Add(new ValidationResult("Start date and time must be greater than current time", new []{"StartDateTime"}));
        }

        if (EndDateTime <= StartDateTime)
        {
            results.Add(new ValidationResult("EndDateTime must be greater that StartDateTime", new [] {"EndDateTime"}));
        }

        return results;
    }     
}

이것에 대한 유일한 단점은 Validate 가 jQuery 유효성 검사가 아니라 서버 측을 실행한다는 것입니다.

MVC 5에 대한 기본 유효성 검사가 어디서 날짜의 최소 및 최대 값을 설정할 수 있습니까?

내 모델에서 나는 날짜 확인을 원한다.

    public class MyClass
    {               
        [Required(ErrorMessage="Start date and time cannot be empty")]
        //validate:Must be greater than current date
        [DataType(DataType.DateTime)]
        public DateTime StartDateTime { get; set; }

        [Required(ErrorMessage="End date and time cannot be empty")]
        //validate:must be greater than StartDate
        [DataType(DataType.DateTime)]
        public DateTime EndDateTime { get; set; }            
    }

Ps :이 Asp.Net 웹 사이트 에 따르면 Date 유효 기간 유효성 검사기를 사용하는 데 문제가 있으며 권장되지 않습니다.

참고 : jQuery 유효성 검사는 Range 속성 및 DateTime과 함께 작동하지 않습니다. 예를 들어, 다음 코드는 날짜가 지정된 범위 내에 있어도 항상 클라이언트 측 유효성 검사 오류를 표시합니다.

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]

DateTime과 함께 Range 속성을 사용하려면 jQuery 날짜 유효성 검사를 비활성화해야합니다. 일반적으로 모델에서 어려운 날짜를 컴파일하는 것은 좋지 않으므로 Range 속성과 DateTime을 사용하지 않는 것이 좋습니다.

또한 Fluent Validation 과 Foolproof와 같은 Nuget 패키지가 있으며 날짜가 다른 것보다 큰지 확인하고 확인하기위한 트릭을 수행하지만 기본적으로 날짜의 최소값과 최대 값을 확인하는 것이 있는지 알고 싶었습니다.

MVC 5.1의 새로운 기능 인 Whats 에서 본 MinLength MaxLengthMinLength 유효성 검사가 지원됩니다.


jQuery 날짜 유효성 검사를 비활성화 할 필요가 없습니다 (다른 문제를 일으킬 수 있음). $.validatorrange 메소드를 오버라이드 할 필요가있다.

기본적으로 숫자 값과 함께 작동하고 문자열 비교로 돌아옵니다. 따라서 다음 스크립트를 추가 할 수 있습니다 ( jquery.validate.jsjquery.validate.unobtrusive.js 다음에 추가 할 수 있지만 $(document).ready

$.validator.methods.range = function(value, element, param) {
    if ($(element).attr('data-val-date')) {
        var min = $(element).attr('data-val-range-min');
        var max = $(element).attr('data-val-range-max');
        var date = new Date(value).getTime();
        var minDate = new Date(min).getTime();
        var maxDate = new Date(max).getTime();
        return this.optional(element) || (date >= minDate && date <= maxDate);
    }
    // use the default method
    return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
};

그런 다음 속성에 RangeAttribute 를 사용할 수 있습니다.

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
public DateTime Date { get; set; }

일반적으로 서버에서 무언가의 유효성을 검사 할 때이 솔루션을 사용합니다. MVC가 사용하는 유효성 검사 모델에 의존 할 수 있다는 것을 알고 있지만 유효성 검사를 수행 할 때 단위 테스트를 수행해야 할 경우를 대비하여 별도의 프로젝트를 사용하려고합니다. 두 개의 응용 프로그램, 하나의 바탕 화면과 하나의 웹이 있다고 가정하면 두 응용 프로그램 모두에서 동일한 "보기"/ "화면"에 대한 코드를 반복하지 않고 둘 다 ValidationProject를 공유 할 수 있습니다. 여기서 아이디어는 유효성 검사 프로젝트를 솔루션의 독립적 인 프로젝트로 분리하는 것입니다.

그래서 FluentValidation 프로젝트를 NuGet에서 다운로드 할 수 있습니다. FluentValidation은 생성자 내부에서 Rules를 사용합니다. https://github.com/JeremySkinner/FluentValidation/wiki 에서 문서를 볼 수 있습니다.

날짜 규칙은 다음과 같이이 방법으로 사용할 수 있습니다. 여기에서 최소값과 최대 값에 대한 규칙을 입력 할 수도 있습니다.

public class CustomerValidator: AbstractValidator<Customer> {
  public CustomerValidator() {
                    RuleFor(customer => customer.startDate)
                    .NotNull()
                    .WithMessage("You should select a start date")
                    .Must(d => d.HasValue && d.Value <= DateTime.Today)
                    .WithMessage("The start date should not be greather than current month/year");
  }

이제 컨트롤러 내부

[HttpPost]
public ActionResult Index(Customer c)
{
  if(ModelState.IsValid)
  {
    var validator= new CustomerValidator();
    var valResult = validator.Validate(c);

    if (valResult.Errors.Count != 0)
    {
       valResult.Errors.ForEach(x => ModelState.AddModelError(x.PropertyName, x.ErrorMessage));
       return View(vm);
    }

    //Your code here
  }
}




model-validation