0

こんにちは、モデルの作成方法が原因で、いくつかのカスタム検証属性を作成する必要がある魔女の状況があります。モデルは次のようになります。

public class EvaluationFormDataContract
{
    public int StudentAssignmentInstanceId { get; set; }

    public int EvaluationType { get; set; }


    public List<CategoriesOnEvaluationDataContract> Categories { get; set; }
}

  public class CategoriesOnEvaluationDataContract
{
    public string Memo { get; set; }

    public int CategoryId { get; set; }

    public List<QuestionsOnEvalCategoryDataContract> Questions { get; set; }

    // Fields needed for validation
    public bool? HasMemo { get; set; }

    public bool MemoIsMandatory { get; set; }
}

    public class QuestionsOnEvalCategoryDataContract
{
    public string Memo { get; set; }

    public string Grade { get; set; }

    public int QuestionId { get; set; }

    // Fields needed for validation
    public bool HasGrade { get; set; }

    public bool HasMemo { get; set; }

    public bool ShowOnlyMemo { get; set; }
}

ご覧のとおり、モデルは 2 レベルの深さで構成されています。そして、モデルが HasMemo であるかどうか、および MemoIsMandatory であるかどうかを確認する第 2 レベルから始めて検証する必要があります。

3 番目の検証は、HasGrade と HasMemo かどうかを確認する必要がある 3 番目のレベルで行う必要があります。

通常、それが私次第であれば、これをサーバーへの3つの別々の呼び出しに分割しますが、私たちはレガシープロジェクトに依存しており、今のところこれを機能させる必要があります.

post アクションは ajax 呼び出しを介して呼び出され、このすべてのデータが含まれます。

私の質問は、検証属性をどこに追加すればよいですか?

Categories の一番上に追加して、モデルのすべてのレベルを直接担当する必要がありますか?

または、各モデルに配置して、データ バインダーにそれを認識させる方法を見つける必要がありますか? もしそうなら、どうすればこれを行うことができますか?

4

1 に答える 1

1

両方できます。System.ComponentModel.DataAnnotations.IValidatableObject最上位レベルでインターフェイスを実装すると、グラフ全体のプロパティで好きなことをして、エラーを返すことができます。

public class EvaluationFormDataContract : IValidatableObject
{
        // All properties go here

        public IEnumerable<ValidationResult> Validate(
                                 ValidationContext validationContext)
        {
            if (// do what you want)
                yield return new ValidationResult("message");
        }
}

または、下位レベルで属性を適用すると、自動的にバインディングがグラフ内のプロパティを検証します。特別なことをする必要はありません。

于 2013-07-29T09:38:27.117 に答える