Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC3自定义不引人注目的验证-从复选框强制验证_Asp.net Mvc 3_Jquery Validate_Unobtrusive Validation - Fatal编程技术网

Asp.net mvc 3 MVC3自定义不引人注目的验证-从复选框强制验证

Asp.net mvc 3 MVC3自定义不引人注目的验证-从复选框强制验证,asp.net-mvc-3,jquery-validate,unobtrusive-validation,Asp.net Mvc 3,Jquery Validate,Unobtrusive Validation,我有以下用于自定义验证的类: [AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=true)] public sealed class RequiredIfAnyTrueAttribute : ValidationAttribute, IClientValidatable { private const string DefaultErrorMessage = "{0} is required

我有以下用于自定义验证的类:

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
public sealed class RequiredIfAnyTrueAttribute : ValidationAttribute, IClientValidatable
{
    private const string DefaultErrorMessage = "{0} is required";

    public List<string> OtherProperties { get; private set; }

    public RequiredIfAnyTrueAttribute(string otherProperties)
        : base(DefaultErrorMessage)
    {
        if (string.IsNullOrEmpty(otherProperties))
            throw new ArgumentNullException("otherProperty");

        OtherProperties = new List<string>(otherProperties.Split(new char[] { '|', ',' }));
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, name);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null)
        {
            foreach (string s in OtherProperties)
            {
                var otherProperty = validationContext.ObjectType.GetProperty(s);
                var otherPropertyValue = otherProperty.GetValue(validationContext.ObjectInstance, null);

                if (otherPropertyValue.Equals(true))
                    return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
            }
        }

        return ValidationResult.Success;
    }

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

        clientValidationRule.ValidationParameters.Add("otherproperties", string.Join("|",OtherProperties));

        return new[] { clientValidationRule };
    }
}
当我的强类型视图呈现时,一切都正常工作。如果选择了PROBABC或PropXYZ,则需要输入TestField的值。客户端和服务器端验证都是功能性的

但是,鉴于以下事件顺序:

  • 检查PropABC
  • 提交表格
  • 需要为TestField启动客户端验证
  • 取消选中PropABC
  • 客户端验证不会重新启动,并显示验证消息 直到提交表格为止
  • 为了解决#5,我通常会通过jquery onready将click事件附加到复选框,以重新验证


    对于MVC3+Unobstructive+jquery,是否有一种首选/推荐的手动强制客户端验证的方法?

    您需要编写自己的属性吗?如果不是,我认为你可以避免“重新发明轮子”

    效果很好。你把它当作一个NuGet包


    它包括许多用于动态必填字段的各种组合的greate属性等。

    Shawn,附加到事件是获得验证以重新引用的最佳方法

    我建议创建一个名为“validate”的类(或类似的类),将其添加到要验证的每个元素中,然后使用jQuery将该类附加到每个元素的单击和模糊事件(可能还有更改事件),并像这样验证元素:

    $("form").validate().element(this);
    

    万无一失仍处于测试阶段,无法与嵌套的viewmodel以及阵列一起使用

    我尝试了万无一失,但无法与我的场景一起使用。我需要一个给定的字段是必需的,如果其他几个字段中的任何一个是真的。万无一失并没有提供这种内置功能,我也不知道如何成功地扩展它。国际海事组织:我会努力学习如何做到万无一失,即使这需要扩展它。您将花费的前期时间与您从头开始编写自己的解决方案的时间相差甚远。如果我忽略了验证多个目标的要求,并对单个目标属性使用万无一失的RequiremeIftrue属性,则存在我上面描述的相同问题。未选中复选框时不会激发验证,而仅在再次单击“提交”时激发验证。是否存在比通过jquery onready附加onclick事件更好的在复选框交互时重新验证的技术?@Shawn-我没有使用万无一失的方法,但是如果在单个属性上使用多个RequiredIfTrue属性会发生什么?您是否也可以发布自定义客户端验证程序?
    NuGet: install-package foolproof
    
    $("form").validate().element(this);