首页 > 解决方案 > RequiredIf 具有不显眼验证的自定义验证器

问题描述

前几天我构建了一个自定义属性,以验证在选择特定枚举项时该字段是否填充了值。

我编写了类和函数,并且验证器方法在服务器端和客户端都被命中,但无论出于何种原因,尽管 form.valid() 返回 false,但没有错误消息。

看在上帝的份上,我无法弄清楚我做错了什么。

模型

[RequiredIf("AntragStatus", new object[] { AntragStatus.UnterlagenAngefordert })]
public string Bearbeiter { get; set; }

验证器

public class RequiredIf : ValidationAttribute, IClientValidatable
{
    private string _dependentProperty { get; set; }
    private object[] _targetValues { get; set; }

    public RequiredIf(string dependentProperty, object[] targetValues)
    {
        _dependentProperty = dependentProperty;
        _targetValues = targetValues;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var field = validationContext.ObjectType.GetProperty(_dependentProperty);
        var fieldValue = field.GetValue(validationContext.ObjectInstance, null);
        var fieldValueEqualsTargetValue = false;

        foreach (var targetValue in _targetValues)
        {
            if (fieldValue.Equals(targetValue))
            {
                fieldValueEqualsTargetValue = true;
                if (value != null)
                {
                    return ValidationResult.Success;
                }
            }
        }

        return fieldValueEqualsTargetValue ? new ValidationResult("Es sind nicht alle benötigten Felder gefüllt!") : ValidationResult.Success;
    }

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

        rule.ValidationParameters.Add("dependentproperty", _dependentProperty);
        rule.ValidationParameters.Add("targetvalues", GetTargetValues());

        yield return rule;
    }

    private string GetTargetValues()
    {
        var tValues = "";
        foreach (var targetValue in _targetValues)
        {
            tValues += targetValue + ",";
        }

        tValues = tValues.Remove(tValues.Length - 1);

        return tValues;
    }
}

JavaScript

$.validator.addMethod("requiredif",
    function (value, element, parameters) {
        var isInTargetValues = false;
        var id = parameters["dependentproperty"];
        var targetValues = parameters["targetvalues"].split(",");
        var controls = ASPxClientControl.GetControlCollection();
        var statusValue = controls.GetByName(id).GetValue();

        for (var i = 0; i < targetValues.length; i++) {
            if (targetValues[i] == statusValue) {
                isInTargetValues = true;
                if ($.trim(value) != "") {
                    return true;
                }
            }
        }

        if (!isInTargetValues) {
            return true;
        } else {
            return false;
        }
    });

$.validator.unobtrusive.adapters.add(
    "requiredif",
    ["dependentproperty", "targetvalues"],
    function (options) {
        options.rules["requiredif"] = {
            dependentproperty: options.params["dependentproperty"],
            targetvalues: options.params["targetvalues"]
        };

        var msg = "Das Feld " + options.element.name + " muss gefüllt sein";

        options.messages["requiredif"] = msg;
    });

网络配置

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="vs:EnableBrowserLink" value="false" />
  </appSettings>

剃刀

@{
    Html.EnableClientValidation();
    Html.EnableUnobtrusiveJavaScript();
}

标签: asp.net-mvcunobtrusive-validation

解决方案


推荐阅读