【问题标题】:Custom Validation Attribute for three levels deep model三层深度模型的自定义验证属性
【发布时间】:2013-07-29 08:21:46
【问题描述】:

您好,我有一种情况,我必须创建一些自定义验证属性,因为我的模型是创建的。模型看起来像这样:

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。

第三次验证应该在第三级完成,我必须检查它是否 HasGrade 和 HasMemo。

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

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

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

是否应该加在 Categories 的顶部,让它直接负责模型的所有层级?

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

【问题讨论】:

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


    【解决方案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");
            }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2019-09-06
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      相关资源
      最近更新 更多