如何使用自定义验证器验证.Net中的double值?

时间:2012-12-18 13:28:56

标签: json validation asp.net-web-api customvalidator custom-validators

我正在开发一个ASP.Net web api项目,我想根据我从客户端获得的JSON请求来验证我的服务器数据模型。在我的服务器模型类中,我有一个double值,我从客户端发送值为“12,14”。我编写了一个自定义验证类,它由.Net的ValidationAttribute类实现,我使用IsValid(Object value)方法来验证此用户输入。

因此当我将输入发送为“12,14”时,.Net会自动将此“12,14”转换为“1214”,认为“,”是一个组分隔符。但在这种情况下,“,”不是群组分隔符,因为这是挪威文化格式的有效双号(“无”文化)。

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.
}

这是我为验证“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);
    }
}

所以这是我的问题。我想要的是在客户端进入IsValid(对象值)方法的输入参数时获取值。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以使用自定义模型绑定器。我知道您可以在常规MVC站点上使用它,因此我假设可以在Web API上使用相同或类似的代码。有一个很好的例子,可以使用自定义绑定器在Phil Haack's site解析双值。

答案 1 :(得分:0)

罪魁祸首可能是Json.NET,它将12,14翻译成1214。您应该考虑编写一个更加谨慎的自定义转换器。

您应该能够找到在网络上编写自己的转换器的说明。这是一个例子:

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