Обрезать каждое поле ввода, кроме полей с атрибутом 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" или "-". Если это единственный случай, конечно...