DataAnnotation 유효성 검사 속성에 대한 Int 또는 Number DataType


111

MVC3 프로젝트에서 축구 / 축구 / 하키 / ... 스포츠 게임에 대한 점수 예측을 저장합니다. 따라서 내 예측 클래스의 속성 중 하나는 다음과 같습니다.

[Range(0, 15, ErrorMessage = "Can only be between 0 .. 15")]
[StringLength(2, ErrorMessage = "Max 2 digits")]
[Remote("PredictionOK", "Predict", ErrorMessage = "Prediction can only be a number in range 0 .. 15")]
public int? HomeTeamPrediction { get; set; }

이제 int제 경우에는 데이터 유형에 대한 오류 메시지도 변경해야합니다 . 기본적으로 사용되는 "HomeTeamPrediction 필드는 숫자 여야합니다."가 있습니다. 이 오류 메시지를 변경하는 방법을 찾아야합니다. 이 유효성 검사 메시지는 원격 유효성 검사에 대한 예측도 취하는 것 같습니다.

나는 [DataType]속성을 시도 했지만 이것은 system.componentmodel.dataannotations.datatype열거 에서 평범한 숫자가 아닌 것 같습니다 .

답변:


221

모든 번호 유효성 검사에 대해 요구 사항에 따라 다른 범위 유효성 검사를 사용해야합니다.

정수의 경우

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")]

플로트 용

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")]

더블

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]

4
이것은 내 맥락에서 나를 위해 작동하지 않았습니다. 사용자가 "asdf", [Range (typeof (decimal), "0", "9999.99"를 입력하면, ErrorMessage = "{0}의 값은 {1}에서 {2} 사이 여야합니다")] 예외가 발생합니다. 그러나 [Range (typeof (decimal), "0.1", "9999.99", ErrorMessage = "Value for {0} must be between {1} and {2}")]을 수행하면 오류 메시지가 올바르게 작동합니다. 0 대 0.1, 말이되지 않습니다. 버그일까요?
meffect

1
이 "정수"유효성 검사는 정수가 아닌 값을 유효한 것으로 처리합니다 (예 : 0.3)
kevinpo

77

다음 정규식 중 하나를 시도하십시오.

// for numbers that need to start with a zero
[RegularExpression("([0-9]+)")] 


// for numbers that begin from 1
[RegularExpression("([1-9][0-9]*)")] 

도움이되기를 바랍니다 : D


13
더 간단한 방법이 없습니까? [Numeric (ErrorMessage = "이 필드는 숫자 여야합니다.")]
Banford 2011

3
불행하게도. 언제든지 고유 한 유효성 검사 속성을 작성할 수 있습니다.
Goran Žuri

2
이것은 문자열을 다루기 때문에 더 나은 솔루션입니다. int.MaxValue만 커버2.147.483.647
Christian Gollhardt

19

데이터 주석에 정규식 사용

[RegularExpression("([0-9]+)", ErrorMessage = "Please enter valid Number")]
public int MaxJsonLength { get; set; }

2
속성이 int가 아니라 string이면 질문의 맥락에서 잘 작동하는 것 같습니다.
Paul

1
정규 표현식 주위에 괄호가있는 이유는 무엇입니까? 그저 그럴 수 [0-9]+있습니까?
polkduran

5
public class IsNumericAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            decimal val;
            var isNumeric = decimal.TryParse(value.ToString(), out val);

            if (!isNumeric)
            {                   
                return new ValidationResult("Must be numeric");                    
            }
        }

        return ValidationResult.Success;
    }
}

5

이 속성을 시도하십시오.

public class NumericAttribute : ValidationAttribute, IClientValidatable {

    public override bool IsValid(object value) {
        return value.ToString().All(c => (c >= '0' && c <= '9') || c == '-' || c == ' ');
    }


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "numeric"
        };
        yield return rule;
    }
}

또한 유효성 검사기 플러그인에 속성을 등록해야합니다.

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

0

거의 10 년이 지났지 만이 문제는 Asp.Net Core 2.2에서도 여전히 유효합니다.

data-val-number입력 필드에 메시지에 현지화 사용 을 추가 하여 관리했습니다 .

<input asp-for="Age" data-val-number="@_localize["Please enter a valid number."]"/>

0

ASP.NET Core 3.1

이것은 내 기능의 구현이며 다른 속성과 마찬가지로 사용자 정의 오류 메시지로 눈에 띄지 않는 jquery 유효성 검사뿐만 아니라 서버 측에서도 작동합니다.

속성 :

  [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
    public class MustBeIntegerAttribute : ValidationAttribute, IClientModelValidator
    {
        public void AddValidation(ClientModelValidationContext context)
        {
            MergeAttribute(context.Attributes, "data-val", "true");
            var errorMsg = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
            MergeAttribute(context.Attributes, "data-val-mustbeinteger", errorMsg);
        }

        public override bool IsValid(object value)
        {
            return int.TryParse(value?.ToString() ?? "", out int newVal);
        }

        private bool MergeAttribute(
              IDictionary<string, string> attributes,
              string key,
              string value)
        {
            if (attributes.ContainsKey(key))
            {
                return false;
            }
            attributes.Add(key, value);
            return true;
        }
    }

클라이언트 측 로직 :

$.validator.addMethod("mustbeinteger",
    function (value, element, parameters) {
        return !isNaN(parseInt(value)) && isFinite(value);
    });

$.validator.unobtrusive.adapters.add("mustbeinteger", [], function (options) {
    options.rules.mustbeinteger = {};
    options.messages["mustbeinteger"] = options.message;
});

마지막으로 사용법 :

 [MustBeInteger(ErrorMessage = "You must provide a valid number")]
 public int SomeNumber { get; set; }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.