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 になります。

最終的な目標は、両方のケースで説明を空にできるようにすることですが、フィールドの 1 つが入力されると、もちろんエラーが伝播するはずです。

検証の再帰を停止すると、フィールドはオプションになりますが、フィールドが入力された場合のフィールドの検証も妨げられます。

これを達成する方法についてのアイデアはありますか?

4

2 に答える 2

7

文字列プロパティでデータ注釈を使用する[Required]と、データベースに null 非許容フィールドが作成されます。あなたの説明から、これらの値の両方を null にしたい場合があるようです。

これらのフィールドをオプションにするものを定義する独自の検証を実装することをお勧めします。

[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 の種類 (Translated、TranslatedOptional、TranslatedMultiline、TranslatedMultilineOptional) ごとに個別のクラスがあるという欠点があります。

もう 1 つの欠点は、検証結果を Translated ではなく 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 {}
于 2011-04-26T12:16:23.220 に答える