Я работаю над приложением 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 );
}