我是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 验证之外,所有标准验证(例如正则表达式定义该值应该是非负整数)都会执行在验证字段并且已经处理了值之后,稍后调用它(不确定是什么触发它)。我做错了什么?
答案 0 :(得分:1)
您的自定义验证程序在c#中实现,并且是“服务器端”。它没有任何相应的客户端javascript实现,所以实际发生的是你的表单被发回到你的验证器运行的控制器,模型验证失败,它回发到页面,显示验证错误。
您需要做的是在服务器端,在您的控制器httpPost处理程序中检查在处理viewModel之前验证是否成功,例如:
if(ModelState.IsValid){
PerformProcessingOf(viewModel);
//Redirect or whatever...
}
else
return view(viewModel);