Problem with double values binding
Asked Answered
F

1

8

In my project I want to allow users input double values in 2 formats: with using ',' or '.' as delimiter (I'm not interested in exponential form). By default value with delimiter '.' don't work. I want this behavior works for all double properties in complex model objects (currently I work with collections of objects, that contains identifiers and values).

What i should use: Value Providers or Model Binders? Please, show code example of solving my problem.

Fifine answered 29/6, 2011 at 11:36 Comment(1)
#5051141 help at all?Wagshul
E
19

You could use a custom model binder:

public class DoubleModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (result != null && !string.IsNullOrEmpty(result.AttemptedValue))
        {
            if (bindingContext.ModelType == typeof(double))
            {
                double temp;
                var attempted = result.AttemptedValue.Replace(",", ".");
                if (double.TryParse(
                    attempted,
                    NumberStyles.Number,
                    CultureInfo.InvariantCulture,
                    out temp)
                )
                {
                    return temp;
                }
            }
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

which could be registered in Application_Start:

ModelBinders.Binders.Add(typeof(double), new DoubleModelBinder());
Edita answered 30/6, 2011 at 6:12 Comment(2)
Thank you for clear answer, but what is the purpose of Value Providers? Is it abstraction over different sources (like form value collection, url parameters, server variables, cookies etc.)?Fifine
Plus, don't forget to add same binder for Nullable typeNatelson

© 2022 - 2024 — McMap. All rights reserved.