不理解编写自己的验证属性的机制

时间:2012-10-16 14:52:44

标签: asp.net-mvc-3 validationattribute

我之前写了一个属性,但我之前没有写过验证属性。我对它如何一起工作感到非常困惑。我已经在线阅读了大部分关于如何实现这一目标的教程。但我有几个问题需要思考。

请记住,我正在尝试编写一个requiredIf属性,如果设置了某个Jquery变量,它只会调用一个远程函数...顺便说一句,这是一个从视图状态拉出来的变量......我想我可以制作我视图模型的那部分。但是我离题了

1)C#代码有点令人困惑。我知道我的属性应该分别扩展ValidationAttribute,IClientValidatable类和接口。但我对每个重叠方法应该做什么感到有点困惑?我正在尝试编写一个requiredIf,如何覆盖这些方法可以帮助我实现这个目标?

2)如果变量不存在,我根本不希望远程功能尝试验证该字段。我不想在我的表单上弹出任何消息。很多教程似乎围绕着这个问题。

3)我对jquery需要做什么感到困惑,将这个函数添加到视图中...我需要添加到JQuery中才能让这个东西工作......看起来好像很多当我只是简单地输入一个jquery函数来完成同样的事情而只需要相同的少量编码时,额外的编码......我知道它还增加了服务器端验证,这很好。但还是......

以下是我对这个等式的jquery方面的看法......

(function ($) {
    $validator.unobtrusive.adapters.addSingleVal("requiredifattribute", "Dependent");
    $validator.addMethod("requiredifattribute", function (value, element, params) {
        if (!this.optional(element)) {
            var otherProp = $('#' + params)
            return (otherProp.val() != value);
        }
        return true;
    })
}(jQuery));

这是我的属性(基本上是从一个必需的教程中复制出来的...我知道我需要更多地定制它,但是一旦我更好地了解每件作品的作用,我就会这样做。 ..

[AttributeUsage(AttributeTargets.Property)]
public class RequiredIfAttribute  : ValidationAttribute, IClientValidatable {
    private const string errorMessage = "The {0} is required.";
    //public string 
    private RequiredAttribute innerAttribute = new RequiredAttribute();
    public string DependentProperty { get; set; }
    public object TargetValue { get; set; }

    public RequiredIfAttribute(string dependentProperty, object targetValue){
        this.DependentProperty = dependentProperty;
        this.TargetValue = targetValue;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
        var field = validationContext.ObjectInstance.GetType().GetProperty(DependentProperty);
        if (field != null) {
            var dependentValue = field.GetValue(validationContext.ObjectInstance, null);
            if ((dependentValue == null && TargetValue == null) || (dependentValue.Equals(TargetValue))) {
                if (!innerAttribute.IsValid(value))
                    return new ValidationResult(ErrorMessage);
            }
        }
        return ValidationResult.Success;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
        ModelClientValidationRule modelClientValidationRule = new ModelClientValidationRule {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "requiredifattribute"
        };
        modelClientValidationRule.ValidationParameters.Add("dependent", DependentProperty);
        yield return modelClientValidationRule;
    }
}

更新:我的工作不正常

以下是我的模型中的属性如何使用上述属性

进行分配
    [RequiredIf("isFlagSet", true)]
    [Remote("ValidateHosFin", "EditEncounter", AdditionalFields = "hospitalFin, encflag", ErrorMessage = "Got Damn this is complex!")]
    [MinLength(6)]
    public string HostpitalFinNumber { get; set; }

我认为我试图对此验证进行关键操作的值是这样设置的......

   ViewData["ADDENCOREDITTEMP"] = encflag;
   if (encflag == "AddEnc"){
       isFlagSet = true;
   }

我把它嵌入我的页面就像这样......

@Html.Hidden("isFlagSet", isFlagSet, new { id = "isFlagSet"}) 

我无法让我的表单提交......那个说他刚试过这个并让它工作的人,你可以发布代码吗?

1 个答案:

答案 0 :(得分:0)

型号:

public class X
{
    [RequiredIf("y", "y", ErrorMessage = "y is not y")]
    public string x { get; set; }

    public string y { get; set; }
}

查看:

@using(Html.BeginForm())
{
    @Html.ValidationSummary()

    @Html.TextBoxFor(m => m.x)
    @Html.TextBoxFor(m => m.y)

    <input type="submit"/>
}

我假设您的验证在服务器端失败了?您的视图模型中是否有isFlagSet属性?