三级深度模型的自定义验证属性

时间:2013-07-29 08:21:46

标签: c# asp.net-mvc asp.net-web-api

嗨,我有一个女巫的情况我必须创建一些自定义验证属性,因为我的模型的创建方式。模型看起来像这样:

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

看起来这个模型可以分为两个层次。 我将从第二级开始验证,我将检查模型HasMemo和MemoIsMandatory。

第三次验证应在第3级进行,我必须检查它是否为HasGrade和HasMemo。

Normaly如果由我决定,我会将其分成三个单独的调用服务器,但我们依赖于遗留项目,目前我必须完成这项工作。

将通过ajax调用调用post操作,并将所有这些数据放入其中。

现在我的问题是我应该在哪里添加验证属性?

是否应将其添加到类别的顶部,使其直接负责模型的所有级别?

或者我应该将它放在每个模型上并找到一种方法让数据绑定器知道它?如果是这样我怎么能这样做?

1 个答案:

答案 0 :(得分: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");
        }
}

或者,您可以在较低级别应用属性,并自动绑定负责验证图表中的属性。你不需要做任何特别的事情。