2016-07-12 2 views
0

MVC 5 프로젝트에서 null 허용 int가있는 모델이 있습니다. 설명하기가 어려울 수 있으므로 null이 될 수있는 int 여야하며 문자열 일 수 없습니다.데이터 주석을 사용하여 nullable int 유효성을 검사하는 방법

// Value can be null or an integer from 0 to 145   
[Range(0,145)] 
public int? Criterion { get; set; } 

의도 된 주석은 형태의 값을 입력 할 때 사용자의 피드백을 제공하는 것이다.

Criterion: @Html.TextBoxFor(m => m.Criterion) 
<span class="text-danger">@Html.ValidationMessageFor(m => m.Criterion)</span> 

정수가 아닌 값을 입력 할 때 사용자가 피드백을받는 동안 Range 속성이 작동하지 않는 것처럼 보입니다.

nullable 정수 범위를 적용하려면 정규 표현식을 사용해야합니까, 아니면 규칙을 적용하는 간단한 방법이 있습니까?

+0

[범위 (대해서 typeof (int)를 "0", "145", ErrorMessage가이 = "beinteger해야 가치 0-145. ")] –

+0

나는 생각한다. 정규식을 추가하면 숫자와 공백을 허용하는 것이 매우 간단한 해결책입니다. –

+0

@ Nathan_Sav - 아무런 유효성 검사도 시도하지 않았습니다. –

답변

7

정확히 기억한다면 [Range] 데이터 주석은 null이 허용되는 정수에 대해 예상대로 작동해야합니다 (즉, 존재하는 경우 해당 숫자가 범위 내에 있는지 확인). 이 서버 측 유효성 검사를 실행하려면 POST 작업에서 ModelState.IsValid으로 전화해야합니다.

예는 아래 그들의 예상되는 결과와 함께 입력 값으로 null, -1, 1150을 사용하여 보여

enter image description here

see an example demonstrating this here을 할 수있다.

+0

문자열을 사용하고 있습니다. 내 모델은 nullable int입니다. –

+0

죄송합니다. 오타를 유감스럽게 생각합니다. 예제를 업데이트하여'int? '를 사용했다면, 예상대로 작동 할 것입니다. –

+0

나는 그것이 귀하의 경우에 효과가 있다는 것을 알고 있습니다. 내 BeginForm의 경우, 내 ViewModel을 게시하지 않습니다. ViewModel을 _filter_하는 데 사용되는 값을 제출 중이므로 적용되지 않을 것입니다. –

0

ValidationAttributeIClientValidatable을 상속하면 맞춤 데이터 주석을 쉽게 만들 수 있습니다.

public class ValidateNullableInt : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     return IsValid(value != null ? value : null) 
    } 

    public override ValidationResult IsValid(object value, ValidationContext context) 
    { 
     bool isValid = false; 
     if(typeof(value) == Nullable<int>) 
     { 
      int? temp = value as Nullable<int>; 

      if(temp.HasVaue > minValue && temp.HasValue < maxValue) 
      { 
       return ValidationResult.Success; 
      } 

      return new ValidatonResult(errorMessage); 
     } 
    } 
} 
+0

어디에서 그 기능을 사용할 수 있습니까? –

+0

원하는 이름으로 폴더를 만들고, 나는'DataAnnotationExtensions'을 사용합니다. 그런 다음,'ValidateNullableInt'라는 이름으로 원하는 클래스를 생성하십시오. 일단 모든 작업을 완료하면 일반 데이터 주석으로 사용하십시오.아마'myProjectName.DataAnnotationExtensions'을 컨트롤러에 추가 할 필요가있을 것입니다. – Ingenioushax

1

나는이 오래지만 오늘 같은 상황을 가지고, 그냥 당신이 Range이 null 값을 확인하지 않는 것을 알 필요가 같은 문제가있는 경우 다른 사람에,하지만 당신은 Required와 함께 사용할 수있어 검증 가능하게하기 위해서는 다음과 같습니다 여기

[Required, Range(0, 145)] 
public int? Criterion { get; set; } 

는 리온의 바이올린을 기반으로 예입니다 : https://dotnetfiddle.net/SBoqJA

관련 문제