ASP.NET MVC - 自定义客户端验证检索其他属性

时间:2015-08-12 14:54:50

标签: c# jquery asp.net asp.net-mvc validation

我想要实现的目标

所以我有一个viewmodel,它包含一个包含Questions列表的对象。我想在问题上验证一个属性,如果问题上的另一个对象(在本例中是一个列表)为null,那么该属性的验证应该失败。

我已经实现了服务器端部分,它完美无缺。 ObjectInstance是一个问题,我可以从中检索我的其他属性。

然而,对于客户端,我没有对象实例可以使用。相反,我有容器和容器类型。容易吗?它们看起来与对象实例相同,所以我可以使用它们。 ContainerType的类型是Question,但Container本身是我的ViewModel实例。这让我感到茫然。我已查看了元数据,并且已在互联网上搜索了几个小时,但我无法找到检索对象实例的方法。

问题

所以我的问题是,如何检索我的对象实例,还是可以用其他方式验证我的要求?

IsValid方法

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var containerType = validationContext.ObjectInstance.GetType();
        var field = containerType.GetProperty(_otherProperty);

        if (field != null)
        {
            var otherProperty = field.GetValue(validationContext.ObjectInstance);
            var option = Convert.ToString(value);
            if (otherProperty == null)
            {
                return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
            }
            return ValidationResult.Success;
        }
        return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
    }

GetClientValidationRules方法

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        //var depProp =  metadata.ContainerType.GetProperty(_otherProperty).GetValue(metadata.Container);
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
        rule.ValidationParameters.Add("otherproperty", depProp);
        rule.ValidationType = "requiredifempty";
        yield return rule;
    }

自定义jQuery验证

if (jQuery.validator && jQuery.validator.unobtrusive) {
            jQuery.validator.unobtrusive.adapters.addSingleVal("requiredifempty", "otherproperty");

            jQuery.validator.addMethod("requiredifempty", function (value, element, requiredifempty) {
                if (requiredifempty === null || requiredifempty === '') {
                    return false;
                }
                return true;
            });
        }

0 个答案:

没有答案