【问题标题】:MVC3 / EF CustomValidator two fields in modelMVC3 / EF CustomValidator 模型中的两个字段
【发布时间】:2011-08-31 11:23:53
【问题描述】:

使用 MVC3 和 EF4.1 如何在客户端和服务器上验证视图模型中的多个字段?

我有一个开始日期文本框(可以修改),并且我在隐藏字段中有原始开始日期。当用户提交表单时,我想检查修改后的开始日期是否不超过原始开始日期的一个月。

我不知道如何使用 DataAnnotation 和 CustomValidation 来做到这一点(或者我可能走错了路)?这是我一直在使用的一个示例:

[MetadataType(typeof(Metadata.MyUserMetaData))]
public partial class MyUser
{
    public System.DateTime DateOfBirth { get; set; }    
}

部分类

public class MyUserMetaData
{
    [CustomValidation(typeof(AmendedStartDate), "amendedstartdate", ErrorMessage = "Invalid date."]
    public DateTime StartDate { get; set; };

    public DateTime OriginalStartDate { get; set; };
}

自定义验证器

public class AmendedStartDate : ValidationAttribute, IClientValidatable
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // How do I get multiple field values from object value?
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(Modelmetadata metadate, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
        ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
            ValidationType = "amendedstartdate"
        };

        yield return rule;
    }
}

我知道我仍然需要将 jQuery 添加到此验证器的视图中。

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework-4.1 data-annotations customvalidator


    【解决方案1】:

    在你的模型类上实现IValidatableObject,而不是使用数据注释——在交叉验证的场景中它更简单、更清晰。

    如果您仍想使用ValidationAttribute,则IsValid 方法中有两个参数:

    • value 表示分配属性的属性的验证值
    • context 是验证属性的上下文。它还包含 ObjectInstanceObjectType 属性以访问整个模型及其类型,因此您可以强制转换实例并访问其他属性。

    【讨论】:

    • 谢谢拉迪斯拉夫。我接受了@counsellorben 的回答,因为我已经走上了这条路,但下次肯定会看看你的解决方案。
    【解决方案2】:

    MVC custom validation: compare two dates 中提出的问题有一个验证器示例,它与模型中的第二个值进行比较。这应该让你开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      相关资源
      最近更新 更多