Проверка целочисленного ввода с использованием маски (Asp .NET MVC 3.0)
Моя модель:
public virtual int? NumberTest { get; set; }
Мой взгляд
@Html.LabelFor(model => model.NumberTest)
<br />
@Html.TextBoxFor(model => model.NumberTest)
Я использую плагин для маскировки, поэтому у меня в представлении:
$("#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="" />
Таким образом, он автоматически генерирует проверку числа на моем входе Integer... И я использую маску с нецелым символом для форматирования числа....
Этот валидатор всегда вызывается при заполнении ввода... Как это исправить?
1 ответ
Что я сделал, так это установил тип данных в строку, чтобы он работал с maskedinput, но затем в привязке пользовательской модели я удалил все нечисловые символы, чтобы его можно было сохранить в базе данных как int. Вы по-прежнему получаете защиту как на стороне клиента, так и на стороне сервера, поскольку пользователь не может вводить нечисловые символы с помощью маскированной входной информации на стороне клиента, а потенциально плохие символы отфильтровываются на стороне сервера.
Вот код привязки пользовательской модели:
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; }
Вот как это можно сделать с помощью maskedinput, шаблонов редактора и ненавязчивой проверки.