Обрежьте все поля ввода, кроме полей с атрибутом 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>
    ...

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

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

    [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 );
}

person Big McLargeHuge    schedule 11.07.2012    source источник
comment
@KyleTrauberman, к сожалению, я не могу контролировать этот аспект. Это должно быть пробелом. Обрезается не браузером, а где-то в приложении.   -  person Big McLargeHuge    schedule 12.07.2012
comment
Случайно удалил свой комментарий: я спросил, кто делает обрезку и можно ли использовать что-то другое вместо пробела.   -  person Kyle Trauberman    schedule 12.07.2012
comment
Есть ли в этом приложении код для обрезки или MVC выполняет обрезку перед привязкой к модели?   -  person Kyle Trauberman    schedule 12.07.2012
comment
@KyleTrauberman см. обновленный вопрос, пожалуйста.   -  person Big McLargeHuge    schedule 12.07.2012


Ответы (3)


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

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

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

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

person dotjoe    schedule 11.07.2012
comment
Вот и все. Закончилось созданием пользовательского атрибута NoteNull, который допускает пробелы. - person Big McLargeHuge; 12.07.2012
comment
Атрибут Require может отклонять пробелы, но, например, при вводе имен, инициалов дополнительный пробел может быть нежелательным, поэтому предложенное решение является отличным. - person baHI; 15.02.2016

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

person Romias    schedule 11.07.2012
comment
Это не вариант, так как данные не в моих руках. - person Big McLargeHuge; 12.07.2012

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

[MinLength(2, ErrorMessage = "State is required")]
[DisplayFormat(ConvertEmptyStringToNull=false)]
person Dave    schedule 23.07.2013
comment
Вместо этого используйте [StringLength(2, ErrorMessage = "State is required")] для ненавязчивой проверки. - person Jaxidian; 29.01.2014