Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trim every input field except those with NoTrim attribute

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 );
}
like image 408
Big McLargeHuge Avatar asked Jul 11 '12 21:07

Big McLargeHuge


1 Answers

NoTrim looks good but it's that [Required] attribute that will reject whitespace.

The RequiredAttribute attribute specifies that when a field on a form is validated, the field must contain a value. A validation exception is raised if the property is null, contains an empty string (""), or contains only white-space characters.

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

To workaround the issue, you could create your own version of the attribute or use a RegexAttribute. I'm not sure the AllowEmptyStrings property would work.

like image 116
dotjoe Avatar answered Sep 25 '22 20:09

dotjoe