ASP.NET 4.5自定义验证属性。 IsValid()调用太晚

时间:2016-07-26 16:23:42

标签: javascript c# jquery asp.net validation

我是ASP.NET世界的新手。我想为viewModel类的属性创建自定义验证。假设此验证检查输入是否是大于10的整数。因此,在MyViewModel.cs文件中,我们有以下代码部分:

[GreaterThanTen]
[RegularExpression("^[0-9][0-9]*$", ErrorMessageResourceType = typeof(Resources.Resource),
        ErrorMessageResourceName = "NonNegativeIntMessage")]
[Required(ErrorMessageResourceType = typeof(Resources.Resource),
        ErrorMessageResourceName = "RequiredValidationMessage")]
[UIHint("OwTextbox")]
public int MyInt { get; set; }

是上述财产的定义,并且:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class GreaterThanTenAttribute : ValidationAttribute
{
    public GreaterThanTenAttribute() : base(Resources.Resource.GreaterThanTen) { }

    protected override ValidationResult IsValid(Object value,ValidationContext validationContext)
    {
        if (value != null)
        {
            if (value is int) // check if it is a valid integer
            {
                int suppliedValue = (int)value;
                if (suppliedValue > 10)
                {
                    return ValidationResult.Success;

                }
            }

        }

        return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
    }

}

是用于定义验证消息的扩展ValidationAttribute类。

然后有一个网页包含这个表格:

<form name="my-form" id="my-form">
  <div class="form-group">
     <label for="MyObject_MyInt">My points:</label>
     <div class="form-group-inner">
         <div class="field-outer">
            @Html.TextBoxFor(m => m.MyObject.MyInt, new { @class = "input-lg"})
            @Html.ValidationMessageFor(m => m.MyObject.MyInt)
         </div>
      </div>
   </div>
</form>

当单击一个按钮时,将调用以下javascript函数以验证TextBox值并将其插入数据库...

function insertData() {
   if ($("#my-form").valid()) {
     ...
   }
}

问题在于,当执行到达if ($("#my-form").valid())时,除了自定义 IsGreaterThanTen 验证之外,所有标准验证(例如正则表达式定义该值应该是非负整数)都会执行在验证字段并且已经处理了值之后,稍后调用它(不确定是什么触发它)。我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的自定义验证程序在c#中实现,并且是“服务器端”。它没有任何相应的客户端javascript实现,所以实际发生的是你的表单被发回到你的验证器运行的控制器,模型验证失败,它回发到页面,显示验证错误。

您需要做的是在服务器端,在您的控制器httpPost处理程序中检查在处理viewModel之前验证是否成功,例如:

if(ModelState.IsValid){
 PerformProcessingOf(viewModel);
 //Redirect or whatever...
}
else
return view(viewModel);