Question

I am developing an ASP.Net web api project and I want to validate my Server data model according to the JSON request I get from the Client side. In my Server Model Class, I have a double value and I am sending value from the Client Side as "12,14". I have written a custom validation class which is implemented by ValidationAttribute class of .Net and I am using IsValid(Object value) method to validate this user input.

So when I send my input as "12,14", .Net automatically converts this "12,14" to "1214" by thinking that "," is a group separator. But in this case, "," is not a group separator since this is a valid Double number for Norwaygian culture format ("no" culture).

public class Client : IClient
{

    public string ClientId { get; set; }
    public int EngagementId { get; set; }
    [MyCustomDoubleType]
    public double MyValue{ get; set; } //Notice that this is my double value to be validated.
}

This is the custom validator which I have written to validate "MyValue"

public class MyCustomDoubleTypeAttribute : ValidationAttribute
{

    public override bool IsValid(object value) //When I send "12,14" from client, the value gets assigned to this value is "1214". .Net thinks "," is a group separator and removes it.
    {
        string doubleValue = value.ToString();
        try
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("no");
            double convertedDouble = double.Parse(doubleValue);
            string convertedString = convertedDouble.ToString(Thread.CurrentThread.CurrentCulture);
            if (convertedString.Equals(doubleValue))
            {
                return true;
            }
            return false;
        }
        catch (FormatException formatException)
        {
            return false;
        }
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(CultureInfo.CurrentCulture,
                             ErrorMessageString,
                             name);
    }
}

So this is my problem. What I want is to get the value as I enter in the client side to the input parameter of IsValid(Object value) method.

Thanks in advance.

Was it helpful?

Solution

You might be able to use a custom model binder. I know that you can use this on a regular MVC site, so I would assume that the same or similar code could be leveraged on Web API. There is a good example of using a custom binder for parsing double values at Phil Haack's site.

OTHER TIPS

The culprit is probably Json.NET that's translating 12,14 into 1214 for you. You should look into writing a custom converter that is more careful about that.

You should be able to find instructions to write your own converter on the web. Here's an example:

How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top