2011-03-13 13 views
12

StringLength veri açıklaması özelliği olan bir açıklama özelliği olan ve uzunluk 100 karakter olarak ayarlanmış bir model sınıfları var. Bu özellik 100'den fazla karakter olduğunda ve Entity Framework bu özelliği kaydetmeye çalıştığında aşağıdaki hatayı alıyorum.C# Nasıl kullanılır DataAnnotations StringLength ve SubString metni kaldırmak için

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

Hata:
Bunun bir çözelti oluşturmada yardımcı olur emin değilim

"Doğrulama fazla ayrıntı için 'EntityValidationErrors' özelliğine bakın bir veya daha fazla varlıkla için başarısız oldu", ama ben Entity Framework CTP5 ve İlk Kod kullanma.

Ne yapmak isterim, açıklama 100 karakterden uzunsa, 100 karakterden uzun karakterleri kaldırın, böylece açıklama kaydedilebilir ve hiçbir hata oluşturulamaz.

Geçerli açıklamanın uzunluğunu tanımlamama yardımcı olmak için DataAnnotation özniteliğini StringLength özelliğini el ile kullanabilmem ve daha sonra geçerli miktarın üzerindeki herhangi bir karakteri kaldırmak için SubString kullanabileceğime inanıyorum.

DataAnnotation'ı bu durumda nasıl kullanacağını bilen var mı? Ya da başka bir seçenek var mı?


Güncelleme Ben BrokenGlass önerdi yaptım ve burada uygulanması halinde: bu yaklaşım olmasa Her zaman yansıma kullanarak özellik değerini kontrol edebilir

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

Bu soru için eklemem gereken başka etiketler var mı? –

+0

DataAnnotation hakkında fazla bir şey bilmiyorum. Diğer seçeneklere gelince, yalnızca alıcıları/ayarlayıcıları uygulayabilir ve sette bir kontrol/kesme yapabilirdiniz. – Rob

+0

Öneriniz için teşekkürler. Bunu bir iş olarak yaptım. Muhtemelen konuyu karmaşıklaştırıyorum. Ancak, Doğrulama'yı ve fazladan karakterleri kaldırmak istediğim diğer durumları görmek istediğim farklı durumları görebiliyorum. Benim WCF uygulamasında, ekstra karakteri kaldırmak ve bir hata yükseltmek istiyorum, ancak bir ASP.NET veya Win Forms gibi bir veri girişi uygulamasında kullanıcı için bir doğrulama mesajı tetiklemek istiyorum. –

cevap

9

en iyisi, etrafta dolanabiliyorsa - pek de hoş değil:

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

Bunu kullanabilirim. Bunu kapsülleyebilir ve kodumun herhangi bir kısmından arayabilirim. Biraz daha bekleyeceğim ve herhangi bir ek cevap alıp alamayacağımı göreceğim. Cevap için teşekkürler. –

2

uzunluğu için veri ek açıklaması yok bir görünüm modeli oluşturun, o zaman varlık modele harita ve 100.

+0

MVC3 uygulamasında doğrulama için veri ek açıklamasına ihtiyacım olduğunu söylemeliyim, böylece kodu tekrarlamak zorunda kalmam. –

+0

Her şey kısıtlamaları uygulamak istediğiniz yere bağlıdır."Data" modelimi temiz tutmaya ve ViewModel'in doğrulamayı zorunlu kılmaya çalışıyorum, böylece ViewModel benim ek açıklamalara sahip oldu. –

10

daha uzun olursa değerini kesecek Neden tüm güçlük? Neden

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" iniz, yalnızca sessizce kırparak doğrulama işlevini tamamen yitiriyor. Bu saçmalık. Doğrulayın veya kırpın. Ama sessizce kırılan, korkunç, korkunç bir fikirdir. – ErikE

İlgili konular