如何使用 DataAnnotations 修饰父属性,但验证子属性

How can I decorate parent with DataAnnotations, but validate for child property

提问人:Hunter Tran 提问时间:11/27/2017 最后编辑:Hunter Tran 更新时间:11/27/2017 访问量:922

问:

假设我有一个 CustomField 类,如下所示

public class CustomField
{
    public string Value { get; set; }
}

然后我有多个 ViewModel 类,每个类都用于另一种类型的窗体

public class FirstViewModel
{
    public CustomField Title { get; set; }
}

public class SecondViewModel
{
    public CustomField Subject { get; set; }
}

如何将数据注释放在 ViewModel 的子属性上,但实际上验证 CustomField 的子属性?

例如,我可以用不同的数据集来修饰 Title 和 Subject,它将根据数据批注验证 CustomField 的 Value 属性

public class FirstViewModel
{
    [CustomFieldStringLength(20, MinimumLength = 2, ErrorMessage = "string length must between 2 and 20")]
    public CustomField Title { get; set; }
}

public class SecondViewModel
{
    [CustomFieldStringLength(30, MinimumLength = 2, ErrorMessage = "string length must between 2 and 30")]
    public CustomField Subject { get; set; }
}

我尝试过什么:

重写 StringLengthAttribute,它将在服务器端工作

public class CustomFieldStringLengthAttribute : StringLengthAttribute
{
    public CustomFieldStringLengthAttribute(int maximumLength) : base(maximumLength)
    {
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        CustomFieldValue customFieldValue = (CustomFieldValue)value;
        return base.IsValid(customFieldValue.Value, validationContext);
    }
}

获取默认适配器以生成正确的客户端验证程序

public class CustomFieldStringLengthAdapter : DataAnnotationsModelValidator<CustomFieldStringLengthAttribute>
{
    public CustomFieldStringLengthAdapter(
        ModelMetadata metadata,
        ControllerContext context,
        CustomFieldStringLengthAttribute attribute) : base(metadata, context, attribute)
    {
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return new[] { new ModelClientValidationStringLengthRule(ErrorMessage, Attribute.MinimumLength, Attribute.MaximumLength) };
    }
}

// Register in Global.asax.cs Application_Start

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CustomFieldStringLengthAttribute), typeof(CustomFieldStringLengthAdapter));

对于客户端,它仍会生成 CustomField 的验证规则,而不是它的 Value。

这是正确的方法吗?

谢谢

C# ASP.NET-MVC 验证 客户端

评论

0赞 11/27/2017
你不能。验证仅适用于属性,不适用于复杂对象,并且仅适用于模型。您需要创建具有不同验证属性的单独“子”视图模型。ValidationContext
0赞 11/27/2017
另一种方法是编写自己的条件验证属性,以便字符串长度基于模型中另一个属性的值,例如,将包含一个属性(例如),并将其设置为 20 英寸和 30 英寸CustomFieldint ValueLengthFirstViewModelSecondViewModel
0赞 Hunter Tran 11/27/2017
你有什么例子@StephenMuecke这样做吗?
1赞 11/27/2017
首先,我将阅读 ASP.NET MVC 3 中的验证完整指南 - 第 2 部分

答: 暂无答案