Обрезать каждое поле ввода, кроме полей с атрибутом NoTrim

Я работаю над приложением ASP.NET MVC 2, которое я не создал. Все поля ввода в приложении обрезаются во время привязки модели. Однако я хочу иметь атрибут NoTrim, который предотвращает обрезку определенных полей.

Например, у меня есть следующее раскрывающееся поле состояния:

<select name="State">
    <option value="">Select one...</option>
    <option value="  ">International</option>
    <option value="AA">Armed Forces Central/SA</option>
    <option value="AE">Armed Forces Europe</option>
    <option value="AK">Alaska</option>
    <option value="AL">Alabama</option>
    ...

Проблема в том, что, когда пользователь выбирает "Международный", я получаю ошибку проверки, потому что два пробела обрезаются и поле State является обязательным для заполнения.

Вот что я хотел бы сделать:

    [Required( ErrorMessage = "State is required" )]
    [NoTrim]
    public string State { get; set; }

Вот что я получил за этот атрибут:

[AttributeUsage( AttributeTargets.Property, AllowMultiple = false )]
public sealed class NoTrimAttribute : Attribute
{
}

В Application_Start устанавливается настраиваемый механизм связывания моделей:

protected void Application_Start()
{
    ModelBinders.Binders.DefaultBinder = new MyModelBinder();
    ...

Вот часть связующего, которая выполняет обрезку:

protected override void SetProperty( ControllerContext controllerContext,
                                     ModelBindingContext bindingContext,
                                     PropertyDescriptor propertyDescriptor,
                                     object value )
{
    if (propertyDescriptor.PropertyType == typeof( String ) && !propertyDescriptor.Attributes.OfType<NoTrimAttribute>().Any() )
    {
        var stringValue = (string)value;

        if (!string.IsNullOrEmpty( stringValue ))
        {
            value = stringValue.Trim();
        }
    }

    base.SetProperty( controllerContext, bindingContext, propertyDescriptor, value );
}

3 ответа

Решение

NoTrim выглядит хорошо, но это [Required] атрибут, который будет отклонять пробелы.

Атрибут RequiredAttribute указывает, что при проверке поля в форме поле должно содержать значение. Исключение проверки возникает, если свойство имеет значение null, содержит пустую строку ("") или содержит только символы пробела.

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx

Чтобы обойти эту проблему, вы можете создать собственную версию атрибута или использовать атрибут RegexAttribute. Я не уверен AllowEmptyStrings собственность будет работать.

Как насчет этого?

[MinLength(2, ErrorMessage = "State is required")]
[DisplayFormat(ConvertEmptyStringToNull=false)]

Я бы просто заменил " " на что-то вроде "-1" или "-". Если это единственный случай, конечно...

Другие вопросы по тегам