I am working on an ASP.NET MVC 2 application that I didn't create. All input fields in the application are trimmed during model binding. However, I want to have a NoTrim attribute that prevents certain fields from being trimmed.
For instance, I have the following state drop-down field:
<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 a user chooses "International", I get a validation error because the two spaces are trimmed and State is a required field.
Here's what I'd like to be able to do:
[Required( ErrorMessage = "State is required" )]
[NoTrim]
public string State { get; set; }
Here's what I've got for the attribute so far:
[AttributeUsage( AttributeTargets.Property, AllowMultiple = false )]
public sealed class NoTrimAttribute : Attribute
{
}
There is a custom model binder that gets set up in Application_Start:
protected void Application_Start()
{
ModelBinders.Binders.DefaultBinder = new MyModelBinder();
...
Here is the part of the model binder that does 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 );
}