我的模特:
public virtual int? NumberTest { get; set; }
我的观点
@Html.LabelFor(model => model.NumberTest)
<br />
@Html.TextBoxFor(model => model.NumberTest)
我正在使用Masked Input Plugin,所以我在我的视图中:
$("#NumberTest").mask("99999-999");
我的Html生成:
<input data-val="true" data-val-number="The field NumberTest must be a number." id="NumberTest" name="NumberTest" type="text" value="" />
所以它会自动在我的整数输入上生成一个数字验证...而且我正在使用带有非整数字符的掩码来格式化数字....
当我填写输入时,总会调用此验证...我该如何解决?
答案 0 :(得分:4)
我所做的是将数据类型设置为字符串,以便它可以与maskedinput一起使用,但是在自定义模型绑定器中,我删除了所有非数字字符,因此它可以作为int保存到数据库中。您仍然可以获得客户端和服务器端保护,因为阻止用户通过maskedinput客户端输入非数字字符,并且可能在服务器端过滤掉可能不正确的字符。
这是自定义模型绑定器代码:
public class CustomModelBinder : DefaultModelBinder
{
protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
{
if (value != null && propertyDescriptor.PropertyType == typeof(string))
{
// always trim strings to clean up database padding
value = ((string)value).Trim();
if ((string)value == string.Empty)
{
value = null;
}
else if ((propertyDescriptor.Attributes[typeof(PhoneNumberAttribute)] != null
|| propertyDescriptor.Attributes[typeof(ZipCodeAttribute)] != null
|| propertyDescriptor.Attributes[typeof(SocialSecurityNumberAttribute)] != null)
&& bindingContext.ValueProvider.GetValue(propertyDescriptor.Name) != null
&& bindingContext.ValueProvider.GetValue(propertyDescriptor.Name).AttemptedValue != null)
{
value =
Regex.Replace(bindingContext.ValueProvider.GetValue(propertyDescriptor.Name).AttemptedValue,
"[^0-9]", "");
}
}
base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
}
}
自定义属性只是空属性:
public class ZipCodeAttribute : Attribute { }
在视图模型中,只需标记您的字段:
[ZipCode]
public string Zip { get; set; }
以下是whole thing with maskedinput, editor templates and unobtrusive validation。
的操作方法