5

我们使用复杂类型来管理我们的可翻译字段,如下所示:

[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); 
        }
    }
}

我们要求这些字段存在。但在某些情况下,整个 Translated 字段是可选的,如下所示:

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。

最终目标是在这两种情况下都允许描述为空,但是当其中一个字段被填充时,错误当然应该传播。

停止验证递归将导致该字段是可选的,但它也会阻止验证字段以防它们填写。

关于如何做到这一点的任何想法?

4

2 回答 2

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.");
    }
}
于 2011-04-24T17:24:17.680 回答
0

这就是我现在正在做的事情。它的缺点是,对于每种已翻译(Translated、TranslatedOptional、TranslatedMultiline 和 TranslatedMultilineOptional),您都有单独的类。

另一个缺点是我不知道如何将验证结果添加到 NL en EN 字段本身而不是 Translated。

[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 {}
于 2011-04-26T12:16:23.220 回答