2014-01-27 7 views
0

나는이 사용 날짜 값에 주어진 값의 범위에 따라 제한을 만들려고 노력 해요 :범위 제한, 날짜 시간

[Range(typeof(DateTime), "1/1/1971", DateTime.Now.AddDays(1).ToString())] 
public DateTime date { get; set; } 

을하지만, 나는 오류가 나는 변수를 사용할 수 없다는있어 그 제한에. 어떻게 그걸 얻을 수 있니?

미리 감사드립니다.

답변

0

RangeAttribute Class 또는 RangeAttribute Constructor (Type, String, String) 설명서에 지정되어 있지 않지만 생성자는 상수 값을 필요로합니다.

+0

좋아, 답장을 보내 주셔서 감사합니다.하지만 저의 경우 어떻게 수정합니까? – user3212730

+1

당신의 유일한 옵션은 유효성 검사 중에 DateTime.Now.AddDays (1) -part를 수행하는 사용자 정의 범위 유효성 검사기를 작성하는 것입니다. – Mark

+0

'[Attr (a, b, c)] '구문을 사용하여 속성을 적용 할 때,'a','b' 및'c' 인수는 항상 컴파일시의 상수 여야합니다. 이것은 C#의 한계이며 컴파일 타임에 속성을 출력 파일에 "굽는"방법입니다. 그래서'RangeAttribute' 클래스의 스펙에있을 필요는 없습니다. 다른 상황에서는 non-const를 사용할 수 있습니다. 예를 들어'var myTest = new RangeAttribute (notConst.GetType(), CalculateSomeString(), DateTime.Now.AddDays (1) .ToString()); ' 물론 그의 문제가있는 질문자. –

1

특성에 상수 값이 필요하므로 사용자 지정 메타 데이터 공급자를 구현해야합니다. 그런 다음 범위의 최종 값을 동적으로 주입합니다.

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) 
    { 
      base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 

      foreach (var attribute in attributes.OfType<RangeAttribute>()) 
      { 
       if (attribute.OperandType == typeof(DateTime) 
       { 
        attribute.Maximum = DateTime.Now.AddDays(1).ToString(); 
       } 
      } 
    } 
} 

또 다른 옵션은 사용자 지정 유효성 검사 특성을 만드는 것입니다. 이 줄의 어떤 것 :

public class CustomDateRangeAttribute : RangeAttribute 
{ 
    public CustomDateRangeAttribute() 
    { 
      base(); 
      base.Maximum = DateTime.Now.AddDays(1).ToString(); 
    } 
}