我正在尝试通过Unobtrusive AJAX表单在MVC 3中实现客户端验证。
public class PhoneNumberAttribute : RegularExpressionAttribute, IClientValidatable
{
private const string Message = " must be a valid phone number";
public PhoneNumberAttribute()
: base(@"^[\s\d\+\(\)]+$")
{
ErrorMessage = "{0}" + Message;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
return new List<ModelClientValidationRule>() {
new ModelClientValidationRule{
ValidationType="phonenumber",
ErrorMessage= metadata.DisplayName + " " + Message
}
};
}
}
型号:
public class MyModel
{
[DisplayName("Phone Number")]
[PhoneNumber]
public string PhoneNumber{ get; set; }
}
HTML
<% using (Ajax.BeginForm("Contact", new AjaxOptions() { UpdateTargetId = "ajaxcontactform",
OnBegin = "ShowProcessing",
OnComplete = "HideProessing",
InsertionMode = InsertionMode.Replace
}))
{%>
<%: Html.ValidationSummary()%>
<%: Html.TextBoxFor(m => m.PhoneNumber, new { Class = "contacttextform" })%>
<input id="sendBtn" name="send" type="submit" class="contactformbutton" value="Send" />
<%}%>
我已经为包含[Required]属性以及自定义验证属性的字段包含了必需的.js文件和其他客户端验证工作。
请说明为什么它不能用于PhoneNumber字段?
谢谢,
答案 0 :(得分:0)
C#代码只是验证的一面。所有你在那里做的是定义元数据来执行验证。您还需要使用不引人注目的JavaScript注册验证,在JavaScript中,请参阅
Unobtrusive validation of collection
和
修改强>
看了之后我想知道你是不是在想这个。我不明白为什么你需要IClientValidatable
,因为你所做的一切都是从RegularExpressionAttribute
继承而来,请尝试以下方法:
public class PhoneNumberAttribute : RegularExpressionAttribute
{
private const string Message = " must be a valid phone number";
public PhoneNumberAttribute()
: base(@"^[\s\d\+\(\)]+$")
{
ErrorMessage = "{0}" + Message;
}
}