2011-03-13 5 views
12

데이터 주석 속성이 StringLength이고 설명 길이가 100 자로 설정된 설명 속성이있는 모델 클래스가 있습니다. 이 속성이 100자를 넘고 Entity Framework가이 속성을 저장하려고하면 다음 오류가 발생합니다.C# DataAnnotations StringLength 및 SubString을 사용하여 텍스트를 제거하는 방법

[StringLength(100, ErrorMessage = "Description Max Length is 100")] 
     public string Description { get; set; } 

오류 :
나는이 솔루션을 형성하는 데 도움이 있는지 확실하지 않습니다

". 검증은 자세한 내용은 'EntityValidationErrors'속성을 참조 하나 이상의 개체 실패",하지만 난 Entity Framework CTP5 및 코드 우선을 사용합니다.

설명이 100자를 초과하면 설명을 저장할 수 있고 오류가 발생하지 않도록 100 자 이상의 문자를 제거합니다.

DataAnnotation 특성을 수동으로 StringLength 유효한 설명 길이를 식별하고 SubString 사용하여 유효한 금액을 통해 제거 할 수 있도록 수동으로 사용할 수 있어야한다고 생각합니다.

누구나이 상황에서 DataAnnotation을 사용하는 방법을 알고 있습니까? 또는 다른 옵션을 사용할 수 있습니까?


업데이트 내가 BrokenGlass이 무엇을 제안했다 여기 내 구현 경우 : 그 방법은 아니지만 당신은 항상, 반사를 이용하여 속성 값을 확인할 수 있습니다

public static class DataAnnotation 
{ 
    public static int? GetMaxLengthFromStringLengthAttribute(Type modelClass, string propertyName) 
    { 
     int? maxLength = null; 
     var attribute = modelClass.GetProperties() 
         .Where(p => p.Name == propertyName) 
         .Single() 
         .GetCustomAttributes(typeof(StringLengthAttribute), true) 
         .Single() as StringLengthAttribute; 

     if (attribute != null) 
      maxLength = attribute.MaximumLength; 

     return maxLength; 
    } 
} 


int? maxLength = DataAnnotation.GetMaxLengthFromStringLengthAttribute(typeof(Car), "Description"); 

if(maxLength != null && car.Description.Length > maxLength) 
    car.Description = car.Description.Substring(0, maxLength.Value); 

BarDev

+0

이 질문에 추가해야하는 다른 태그가 있습니까? –

+0

DataAnnotation에 대해 많이 모릅니다. 다른 옵션에 관해서는 getter/setter를 구현하고 setter에서 check/truncation을 수행 할 수 있습니다. – Rob

+0

제안 해 주셔서 감사합니다. 방금 작업 한 것입니다. 나는 아마도 문제를 복잡하게 만든다. 그러나 다른 상황에서 유효성 검사 및 추가 문자를 제거하려는 다른 상황을 볼 수 있습니다. 내 WCF 응용 프로그램에서 추가 문자를 제거하고 오류를 발생시키지 않을 것이지만 ASP.NET이나 Win Forms와 같은 데이터 입력 응용 프로그램에서 사용자에게 유효성 검사 메시지를 보내고 싶습니다. –

답변

9

주변을 둘러 볼 수 있다면 가장 좋습니다. 예쁜 것은 아닙니다.

var attribute = typeof(ModelClass).GetProperties() 
            .Where(p => p.Name == "Description") 
            .Single() 
            .GetCustomAttributes(typeof(StringLengthAttribute), true) 
            .Single() as StringLengthAttribute; 

Console.WriteLine("Maximum Length: {0}", attribute.MaximumLength);  
+0

이것을 사용할 수 있습니다. 이 코드를 캡슐화하여 코드의 어느 부분에서든 호출 할 수 있습니다. 좀 더 기다려서 추가 답변이 있는지 확인하겠습니다. 답변 해주셔서 감사합니다. –

2

길이에 대한 데이터 주석이없는 뷰 모델을 만든 다음 엔터티 모델에 매핑하고 값이 100보다 길면자를 수 있습니다.

+0

필자는 코드를 반복 할 필요가 없도록 MVC3 응용 프로그램에서 평가를 위해 데이터 주석이 필요하다고 언급 했어야합니다. –

+0

모두 제약 조건을 적용 할 위치에 따라 다릅니다.내 "데이터"모델을 깨끗하게 유지하고 ViewModel에 유효성을 검사하여 내 ViewModel에 주석이 포함되도록하는 경향이 있습니다. –

10

왜 모든 번거 로움이 필요합니까? 왜 안돼

private string _description = string.Empty; 

[StringLength(100, ErrorMessage = "Description Max Length is 100")] 
public string Description 
{ 
    get { return _description; } 
    set { _description = value.Substring(0,100); }; // or something equivalent 
} 
+8

'set'은 유효성을 완전히 무시하고 자동으로 잘립니다. 그건 무의미한거야. 유효성을 검사하거나 잘립니다. 그러나 자동으로 잘라내는 것은 끔찍하고 끔찍한 생각입니다. – ErikE

관련 문제