2015-03-12 2 views
1

Как вы устанавливаете разные атрибуты MaxLength для класса, используемого многими классами, где MaxLength может быть разным для каждого класса потребления.Атрибуты MaxLength зависят от класса потребления

В моем случае я использую Entity Framework и MVC. У меня сложный тип в моей модели данных сущности для BilingualStrings, которая состоит из английской и французской строк. У меня есть много объектов, которые имеют двуязычную строку, которая использует сложный тип для сопоставления английского и французского языков с соответствующей таблицей/столбцом базы данных. Таким образом, каждая таблица имеет два столбца, но объект имеет одно свойство типа BilingualString. Длина поля всегда одинакова для каждого английского или французского языка в одной таблице, но может быть разной для каждой таблицы.

Вот упрощенный пример того, что я пытаюсь достичь:

public partial class BilingualString 
{ 
    //[MaxLength(40)] Cannot put MaxLength here because it would apply to all instances of BilingualString 
    public string English { get; set; } 
    public string French { get; set; } 
} 

public class ClassWithShortDescription 
{ 
    //[MaxLength(20)] Cannot put MaxLength here because it does not makes sense. It needs to be on each English and French properties. 
    public BilingualString Description { get; set; } 
} 

public class ClassWithLongDescription 
{ 
    //[MaxLength(200)] Cannot put MaxLength here because it does not makes sense. It needs to be on each English and French properties. 
    public BilingualString Description { get; set; } 
} 
+0

Do оба класса ClassWith .... 'происходят из' BilingualString'? – MotoSV

+0

№ Класс потребления - это объекты. – RitchieD

+0

Является ли ваш код доступ к этим атрибутам или они используются как часть проверки состояния модели ASP.NET MVC? – MotoSV

ответ

0

После некоторого чтения и большого количества поисковых запросов, я пришел к выводу, что основная проблема заключается в том, что метаданные, установленные атрибутами данных, являются статическими. Поэтому вложенные свойства класса не могут иметь разные метаданные, даже если они потребляются разными классами. Решение состоит в том, чтобы поместить метаданные в свойство класса потребления. Создайте собственный атрибут maxlength, который применяется к свойству типа BilingualString.

Пользовательские MaxLength Атрибут для BilingualString класс MaxLengthBilingualStringAttribute общественности: MaxLengthAttribute { общественного MaxLengthBilingualStringAttribute (интермедиат длина): основание (длина) { }

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     BilingualString bilingualString = new BilingualString(); 
     if (value.GetType() == typeof(EdmBilingualStringVarCharSingleLine)) 
     { 
      var bs = value as EdmBilingualStringVarCharSingleLine; 
      bilingualString.English = bs.English; 
      bilingualString.French = bs.French; 
     } 
     else 
      return new ValidationResult("MaxLengthBilingualString Attribute does cannot be used with this type."); 
     if (bilingualString.English != null && bilingualString.English.Length > this.Length) 
      return new ValidationResult(string.Format("The maximum field length of {0} has been exceed for {1} English.", this.Length, validationContext.DisplayName)); 
     if (bilingualString.French != null && bilingualString.French.Length > this.Length) 
      return new ValidationResult(string.Format("The maximum field length of {0} has been exceed for {1} French.", this.Length, validationContext.DisplayName)); 
     return ValidationResult.Success; 
    } 
} 

Пример реализации:

public partial class BilingualString 
{ 
    public string English { get; set; } 
    public string French { get; set; } 
} 

public class ClassWithShortDescription 
{ 
    [MaxLengthBilingualString(20)] 
    public BilingualString Description { get; set; } 
} 

public class ClassWithLongDescription 
{ 
    [MaxLengthBilingualString(200)] 
    public BilingualString Description { get; set; } 
} 
-2

Как на английском и французском языках жестко закодированы в BilingualString, вы можете также жестко закодировать два атрибута вместо одного:

public class ClassWithShortDescription 
{ 
    [MaxLengthForEnglish(20)] 
    [MaxLengthForFrench(25)] 
    public BilingualString Description { get; set; } 
} 

public class ClassWithLongDescription 
{ 
    [MaxLengthForEnglish(200)] 
    [MaxLengthForFrench(250)] 
    public BilingualString Description { get; set; } 
} 
+0

Интересно .... Итак, MaxLengthForEnglishAttribute и французский были бы настраиваемыми атрибутами, как бы они установили нормальный атрибут MaxLength? – RitchieD

+0

Проголосовать? Что не так с решением? –

+0

При ближайшем рассмотрении это не имеет никакого смысла. – RitchieD