asp.net mvc의 최소 / 최대 값 유효성 검사기


106

asp.net mvc의 속성을 사용한 유효성 검사는 정말 좋습니다. [Range(min, max)]예를 들어 다음과 같이 값을 확인하기 위해 지금까지 유효성 검사기를 사용했습니다 .

[Range(1, 10)]
public int SomeNumber { get; set; }

그러나-이제 최소 및 최대 조건을 별도로 확인해야합니다. 다음과 같은 속성을 찾을 것으로 예상했습니다.

[MinValue(1, "Value must be at least 1")]
[MaxValue(10, "Value can't be more than 10")]
public int SomeNumber { get; set; }

이것을 작성하기 위해 미리 정의 된 속성이 있습니까? 아니면 어떻게해야합니까?


FluentValidation은 날짜 범위를 해결하는 또 다른 솔루션이 될 수 있습니다. 다음은 도움이 될 수있는 다른 질문에 대한 제 답변 입니다.
Zinov

답변:


48

MaxValue에 대한 유효성 검사기를 작성하는 방법은 다음과 같습니다.

public class MaxValueAttribute : ValidationAttribute
    {
        private readonly int _maxValue;

        public MaxValueAttribute(int maxValue)
        {
            _maxValue = maxValue;
        }

        public override bool IsValid(object value)
        {
            return (int) value <= _maxValue;
        }
    }

MinValue 속성은 상당히 동일해야합니다.


좋아, 그것들이 존재하기를 기대했지만 그것들을 쓸 수있을만큼 공정했다. 고마워!
stiank81

1
참고로 이것은 자바 스크립트 끝에서 양식을 마술처럼 유효성 검사하지 않습니다. 이를 위해 추가 코드 + js를 작성해야합니다.
basarat 2013 년

3
@basarat 실제로 추가 JS가 필요하지 않습니다. jquery 유효성 검사 라이브러리에는 이미 최소 / 최대 함수가 있습니다 IClientValidation. 위의 속성에 대한 인터페이스 를 구현 하고 GetClientValidationRules메서드 에서 올바른 값을 반환하면됩니다
WickyNilliams

@WickyNilliams가 귀하의 의견에 대한 예를 포함하여 답변을 추가 하시겠습니까, 아니면 CharlesOuellet이 Wicky의 의견 예를 사용하여이 답변을 편집 하시겠습니까? 클라이언트 측 유효성 검사를 포함하는 작업 예제를 찬성하고 싶습니다.
Johnie Karr

@JohnieKarr 더 이상 .NET으로 작업하지 않으므로 많은 답변을 제공 할 수 없습니다. 말했다 즉, 이 답은 아래에 내가 설명을 정확하게 보여줄 것
WickyNilliams

195

최소 / 최대 유효성 검사 속성이 존재하지 않는다고 생각합니다. 나는 다음과 같은 것을 사용할 것입니다.

[Range(1, Int32.MaxValue)]

최소값 1 및

[Range(Int32.MinValue, 10)]

최대 값 10


4
음 .. 이거별로 편 하진 않아 나에게 약간 해키 해 보인다.
stiank81

21
:) 그것은 약간의 해키입니다 ..하지만 때로는 해킹은 좀 더 편안하게
가이

4
이 방법은 기본 오류 메시지를 무시하거나 "속성 x는 -2e ^ 31-1과 10 사이 여야합니다"와 같은 끔찍한 메시지가 표시되는 한 괜찮습니다.
Nine Tails 2014 년

2
이게 어떻게 해키하고 불편한가요? 나에게 좋은 접근 방식 인 것 같습니다.

1
RangeAttributeAllowMultiple = false있으므로 컴파일 할 수 없습니다.
Daniel Schilling

38

이것이 어떻게 수행 될 수 있는지에 대한 완전한 예. 클라이언트 측 유효성 검사 스크립트를 작성할 필요가 없도록 기존 ValidationType = "range"가 사용되었습니다.

public class MinValueAttribute : ValidationAttribute, IClientValidatable
{
    private readonly double _minValue;

    public MinValueAttribute(double minValue)
    {
        _minValue = minValue;
        ErrorMessage = "Enter a value greater than or equal to " + _minValue;  
    }

    public MinValueAttribute(int minValue)
    {
        _minValue = minValue;
        ErrorMessage = "Enter a value greater than or equal to " + _minValue;
    }

    public override bool IsValid(object value)
    {
        return Convert.ToDouble(value) >= _minValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = ErrorMessage;
        rule.ValidationParameters.Add("min", _minValue);
        rule.ValidationParameters.Add("max", Double.MaxValue);
        rule.ValidationType = "range";
        yield return rule;
    }

}

8
좋은 대답입니다. 오류 메시지를 약간 수정합니다. "보다 크거나 같은 값을 입력하십시오"는 더 많은 (문법적으로 말하는) 올바른 오류 메시지입니다.
Tieson T.

0

jQuery Validation Plugin은 이미 최소 및 최대 규칙을 구현하고 있으므로 사용자 정의 속성에 대한 어댑터를 생성하기 만하면됩니다.

public class MaxAttribute : ValidationAttribute, IClientValidatable
{
    private readonly int maxValue;

    public MaxAttribute(int maxValue)
    {
        this.maxValue = maxValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();

        rule.ErrorMessage = ErrorMessageString, maxValue;

        rule.ValidationType = "max";
        rule.ValidationParameters.Add("max", maxValue);
        yield return rule;
    }

    public override bool IsValid(object value)
    {
        return (int)value <= maxValue;
    }
}

어댑터:

$.validator.unobtrusive.adapters.add(
   'max',
   ['max'],
   function (options) {
       options.rules['max'] = parseInt(options.params['max'], 10);
       options.messages['max'] = options.message;
   });

Min 속성은 매우 유사합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.