범위 데이터 주석 속성을 사용하여 최소이지만 최대 소수는 지정하지 않는 방법은 무엇입니까?


150

가격의 10 진수 필드가 0보다 크거나 같아야한다고 지정하고 싶지만 실제로 최대 값을 부과하고 싶지 않습니다.

여기에 내가 지금까지 가지고있는 것이 있습니다 ...이 작업을 수행하는 올바른 방법이 무엇인지 잘 모르겠습니다.

[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }

이것이 데이터베이스로 들어가는 경우 선택한 데이터베이스 유형에 따라 허용되는 최대 수를 지정해야합니까? 그렇지 않으면이 숫자를 초과하면 불쾌한 예외가 발생합니다.
Coops

답변:


226

이런 식으로 어떻습니까 :

[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]

그것은 당신이 찾고있는 것을해야하며 문자열 사용을 피할 수 있습니다.


1
Int32 (Int32.MaxValue)에 사용했으며 괜찮습니다. 감사합니다!
Bronek

15
그것은 바보 같은 유효성 검사 메시지를 보여줍니다 :(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
Piotr Kula

16
@ppumkin Använd ErrorMessage, 즉 [Range (0.0, Double.MaxValue, ErrorMessage = "your error here")]
flafffl

고마워 야곱 좋은 답변입니다!
pimbrouwers

1
@ppumkin은 DataAnnotationsModelValidator 클래스에서 상속하여 오류 메시지를 사용자 정의합니다
Alexander

91

문자열이 멋지게 보이는 것에 대해 걱정한다면 다음을 수행 할 수 있습니다.

    [Range(0, Double.PositiveInfinity)]

기본 오류 메시지는 다음과 같습니다.

SuchAndSuch 필드는 0과 무한대 사이 여야합니다.


11
이것은 IMHO, 확장명, 겉보기에 임의의 문자열 / 숫자, 사용자 정의 코드 및 합리적으로 합리적인 오류 메시지가 가장 좋은 대답입니다.
Vitani

42

최대 값을 수동으로 입력하는 것 외에는 선택의 여지가없는 것 같습니다. 나는 당신이 그것을 지정할 필요가없는 일종의 과부하가 있기를 바랐습니다.

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }

14
이 코드는 끔찍하게 보입니다. 나는 nuget을 통해 그리고 @Nicolai Schlenzig가 대답 한 dataannotationsextensions.org 를 사용하는 것이 좋습니다 . 사용 [Min(0)]-또한 더 나은 유효성 검사 메시지가 있습니다. 답변을 업데이트 해 보시기 바랍니다
Piotr Kula

OP가 마음을 바꾸지 않기 때문에 여기에 최고의 답변과 동일하게 업데이트했습니다. lol
Worthy7

위의 답변 (@Jordan 및 @Jacob)이 훨씬 더 적합합니다. 특히 가격에 대해 이야기하고 있기 때문에. 거래는 십진수 값으로 여러 번 수행해야하지만 가격이 1.234 달러 또는 최소한 사용자에게 표시하고 싶지 않은 경우는 거의 없습니다.
Anastasios Selmanis

@AnastasiosSelmanis, 나는 당신에게 동의하지만 "1.234 달러는 없다"고 말할 때 그 부분을 기대합니다. 당신은 USD를 가정하고 있으며, 심지어 외환에 이것을 사용할 때 (여기에서는 OP는 언급하지 않았지만) USD는 더 많은 10 진수로 들어갑니다. =)
RoLYroLLs 3

35

당신이 사용할 수있는:

[Min(0)]

이렇게하면 필요한 최소값 0 (영)이 적용되고 최대 값이 적용되지 않습니다.

이것을 사용 하려면 DataAnnotationsExtensions 가 필요 합니다.


8
아니요, 이것이 옳지 않다고 생각합니다. Data Annotations Extensions dataannotationsextensions.org 에서 제공하는 표준 MVC3 프레임 워크의 일부가 아닙니다 . MSDN 링크를 제공하십시오.
Bernie White

1
아니오-MVC 3의 일부는 아닙니다. :(이 라이브러리는 어떤 식 으로든 확장이 가능합니다.)
Piotr Kula

1
MVC3의 일부는 아니지만 중요하지 않습니다. 클라이언트 측에서 유효성을 검사하려면 DataAnnotationsExtensions.MVC3 패키지 만 사용하면됩니다. 이 두 패키지는 nuget에서 사용할 수 있습니다. 어리석은 오류 메시지가 없거나 양의 정수 또는 소수를 확인할 때마다 오류 메시지를 다시 정의 할 필요가 없으므로 가장 좋은 방법이라고 생각합니다 (이는 일반적입니다).
gentiane

21

가격을 다루는 경우 1 조 달러 이상의 비용이 들지 않는다고 가정 할 수 있습니다.

나는 사용할 것이다 :

[Range(0.0, 1000000000000)]

또는 실제로 필요한 경우 Decimal.MaxValue쉼표없이 값을 붙여 넣으십시오 .79,228,162,514,264,337,593,543,950,335

짐바브웨 출신이 아닌 경우이 중 하나가 제대로 작동합니다.


7
왜 안돼 [Range(0.0,Decimal.MaxValue)]?
Coops

4
컴파일하지 않습니다. Decimal.MaxValue는 상수가 아닙니다.
John Farrell

오류 텍스트에 대한 리소스 파일을 참조하는 것은 상수가 성가신 일입니다.
Coops

3
이제 통화는 엔이나 다른 것이 아니라 달러라고 가정하고 있습니다.
Fred

1
@jfar Decimal.MaxValue는 상수입니다. 범위에 10 진수를 수용하기 위해 과부하가 없다는 것입니다.
Ε Г И І И О

11

사용자 정의 유효성 검사를 사용할 수 있습니다.

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public int IntValue { get; set; }

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public decimal DecValue { get; set; }

검증 방법 유형 :

public class ValidationMethods
{
    public static ValidationResult ValidateGreaterOrEqualToZero(decimal value, ValidationContext context)
    {
        bool isValid = true;

        if (value < decimal.Zero)
        {
            isValid = false;
        }

        if (isValid)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(
                string.Format("The field {0} must be greater than or equal to 0.", context.MemberName),
                new List<string>() { context.MemberName });
        }
    }
}

2

나는 이런 식으로 시도하려고했다 :

[Range(typeof(decimal), ((double)0).ToString(), ((double)decimal.MaxValue).ToString(), ErrorMessage = "Amount must be greater than or equal to zero.")]

그러나이 작업의 문제점은 컴파일러가 상수 식을 원한다는 것 ((double)0).ToString()입니다. 컴파일러는 것입니다 걸릴

[Range(0d, (double)decimal.MaxValue, ErrorMessage = "Amount must be greater than zero.")]

이것을 다운 투표 한 사람이 왜 내 솔루션이 좋지 않거나 도움이되지 않는다고 생각하는지 설명해 주시겠습니까? 아무런 설명없이 공감하는 것은 전혀 도움이되지 않기 때문입니다.
David T. Macknet

오류 메시지에 "크거나 같음"이 표시되어야합니다.
Ε Г И І И О

잘 잡았습니다. 추가되었습니다.
David T. Macknet

1

범위를 사용하여

[Range(typeof(Decimal), "0", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")]

[Range(typeof(Decimal),"0.0", "1000000000000000000"]

그것이 도움이되기를 바랍니다.



0

나는 둘 것 decimal.MaxValue.ToString()이가 아닌 상한 가지고와 동등한 decmial 유형에 대한 효과적인 천장 때문이다.


4
문제는 상수가 아니라는 것입니다. 이 오류가 발생합니다. 속성 인수는 상수 표현식, 속성 유형 또는 속성 매개 변수 유형의 배열 작성 표현식
이어야

아래에서 지적했듯이 분명히 누군가에게 감사하지 않았습니다.
David T. Macknet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.