Проверка целочисленного ввода с использованием маски (Asp .NET MVC 3.0) - PullRequest
2 голосов
/ 24 июня 2011

Моя модель:

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="" />

Таким образом, он автоматически генерировал проверку числа на моем вводе целых чисел ... И я использую маску с нецелым символом для форматирования числа ....

Этот валидатор всегда вызывается при заполнении ввода ... Как это исправить?

1 Ответ

4 голосов
/ 03 августа 2011

Я установил тип данных в строку, чтобы он работал с 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, шаблонов редактора и ненавязчивой проверки .

...