MaxLength 属性取决于消耗 class
MaxLength attributes depends on consuming class
如何在多个 class 消耗的 class 上设置不同的 MaxLength 属性,其中每个消耗 class.
的 MaxLength 可以不同
就我而言,我使用的是 Entity Framework 和 MVC。我的 BilingualStrings 实体数据模型中有一个复杂类型,它由英语和法语字符串组成。我有许多具有双语字符串的实体,该字符串使用复杂类型将英语和法语映射到正确的数据库 table/column。所以每个 table 有两列,但实体有一个 属性 类型的 BilingualString。单个 table 中每个英语或法语的字段长度始终相同,但每个 table.
的字段长度可能不同
这是我要实现的目标的简化示例:
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; }
}
由于英语和法语在 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; }
}
经过一些阅读和大量谷歌搜索后,我得出结论,潜在的问题是由数据属性设置的元数据是静态的。因此,嵌套的 class 属性不能有不同的元数据,即使被不同的 classes 使用也是如此。解决方案是将元数据放在消费 class 的 属性 上。创建应用于 BilingualString 类型的 属性 的自定义 maxlength 属性。
双语字符串的自定义 MaxLength 属性
public class 最大长度双语字符串属性:最大长度属性
{
public MaxLengthBilingualStringAttribute(int length) : base(length)
{
}
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; }
}
如何在多个 class 消耗的 class 上设置不同的 MaxLength 属性,其中每个消耗 class.
的 MaxLength 可以不同就我而言,我使用的是 Entity Framework 和 MVC。我的 BilingualStrings 实体数据模型中有一个复杂类型,它由英语和法语字符串组成。我有许多具有双语字符串的实体,该字符串使用复杂类型将英语和法语映射到正确的数据库 table/column。所以每个 table 有两列,但实体有一个 属性 类型的 BilingualString。单个 table 中每个英语或法语的字段长度始终相同,但每个 table.
的字段长度可能不同这是我要实现的目标的简化示例:
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; }
}
由于英语和法语在 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; }
}
经过一些阅读和大量谷歌搜索后,我得出结论,潜在的问题是由数据属性设置的元数据是静态的。因此,嵌套的 class 属性不能有不同的元数据,即使被不同的 classes 使用也是如此。解决方案是将元数据放在消费 class 的 属性 上。创建应用于 BilingualString 类型的 属性 的自定义 maxlength 属性。
双语字符串的自定义 MaxLength 属性 public class 最大长度双语字符串属性:最大长度属性 { public MaxLengthBilingualStringAttribute(int length) : base(length) { }
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; }
}