我们正在使用复杂类型来管理我们的可翻译字段:
[ComplexType]
public class Translated
{
[Required]
public string NL { get; set; }
[Required]
public string EN { get; set; }
[ScaffoldColumn(false)]
public string TranslatedText
{
get
{
return Util.Translate(NL, EN);
}
}
}
我们要求字段存在。但在某些情况下,整个翻译字段是可选的,如:
public class Question
{
...
[Optional(ErrorMessage="Foo")]
public Translated Description { get; set; }
...
}
但是,似乎可以计算Optional属性,当它返回false时,结果不会完成。
class OptionalAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
return false;
}
}
当我将可选属性放在非复杂类型上时,它按预期工作,错误消息将始终为Foo。
最终目标是在两种情况下允许描述为空,但是当填充其中一个字段时,错误当然应该传播。
停止验证递归会导致该字段为可选字段,但如果字段 填写,也会阻止字段验证。
关于如何实现这一目标的任何想法?
答案 0 :(得分:7)
在字符串属性上使用数据注释[Required]
将在数据库中创建不可为空的字段。从您的描述中看来,有时您会希望这两个值都为空。
我建议您实施自己的验证,定义使这些字段可选的内容。
[ComplexType]
public class Translated : IValidatableObject
{
public string NL { get; set; }
public string EN { get; set; }
[NotMapped]
public string TranslatedText
{
get
{
return Util.Translate(NL, EN);
}
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!string.IsNullOrEmpty(NL) && string.IsNullOrEmpty(EN))
yield return new ValidationResult("EN is required if NL is entered.");
if (!string.IsNullOrEmpty(EN) && string.IsNullOrEmpty(NL))
yield return new ValidationResult("NL is required if EN is entered.");
}
}
答案 1 :(得分:0)
这就是我现在正在做的事情。它的缺点是,对于每种Translated(Translated,TranslatedOptional,TranslatedMultiline和TranslatedMultilineOptional),你都有单独的类。
另一个缺点是我不知道如何将验证结果添加到NL en EN字段本身而不是转换为。
[ComplexType]
public class TranslatedMultiline : IValidatableObject
{
[DataType(DataType.MultilineText)]
[Display(Name = "dutch", ResourceType = typeof(Caracal.Resources.GUI))]
public string NL { get; set; }
[DataType(DataType.MultilineText)]
[Display(Name = "english", ResourceType = typeof(Caracal.Resources.GUI))]
public string EN { get; set; }
[ScaffoldColumn(false)]
public string TranslatedText
{
get
{
return Util.Translate(NL, EN);
}
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this is IOptional)
{
if (!string.IsNullOrEmpty(NL) && string.IsNullOrEmpty(EN))
yield return new ValidationResult("EN is required if NL is entered.");
// TODO: Translate
if (!string.IsNullOrEmpty(EN) && string.IsNullOrEmpty(NL))
yield return new ValidationResult("NL is required if EN is entered.");
// TODO: Translate
}
else
{
if (string.IsNullOrEmpty(NL))
yield return new ValidationResult("NL is required");
if (string.IsNullOrEmpty(EN))
yield return new ValidationResult("EN is required");
}
}
}
[ComplexType]
public class TranslatedMultilineOptional : TranslatedMultiline, IOptional { }
public interface IOptional {}