I am working on an ASP.NET MVC 2 application that I have not created. All input fields in the application are trimmed during model binding. However, I want to have a NoTrim attribute that prevents cropping of certain fields.
For example, I have the following status dropdown box:
<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> ...
The problem is that when the user selects "International", I get a validation error because two spaces are truncated, and State is a required field.
Here is what I would like to do:
[Required( ErrorMessage = "State is required" )] [NoTrim] public string State { get; set; }
Here is what I have for the attribute:
[AttributeUsage( AttributeTargets.Property, AllowMultiple = false )] public sealed class NoTrimAttribute : Attribute { }
Application_Start creates a custom mediation device:
protected void Application_Start() { ModelBinders.Binders.DefaultBinder = new MyModelBinder(); ...
Here is the part of the bunch that performs the trimming:
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 ); }