Как проверить двойные значения в .Net с помощью специального валидатора?

Я разрабатываю проект веб-API ASP.Net и хочу проверить свою модель данных сервера в соответствии с запросом JSON, который я получаю со стороны клиента. В моем классе модели сервера у меня есть двойное значение, и я отправляю значение со стороны клиента как «12,14». Я написал собственный класс проверки, который реализуется классом ValidationAttribute для .Net, и я использую метод IsValid (значение объекта) для проверки этого пользовательского ввода.

Поэтому, когда я отправляю свой ввод как «12,14», .Net автоматически преобразует это «12,14» в «1214», думая, что «,» является разделителем групп. Но в этом случае «,» не является разделителем групп, так как это допустимое число Double для норвежского культурного формата (культура «нет»).

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 (значение объекта).

Заранее спасибо.


person Thilok Gunawardena    schedule 18.12.2012    source источник


Ответы (2)


Возможно, вы сможете использовать настраиваемую подшивку модели. Я знаю, что вы можете использовать это на обычном сайте MVC, поэтому я предполагаю, что такой же или похожий код можно использовать в веб-API. Хороший пример использования настраиваемого связывателя для анализа двойных значений: Сайт Фила Хаака.

person Mike Stonis    schedule 18.12.2012

Вероятно, виноват Json.NET, который переводит 12,14 в 1214 для вас. Вам следует подумать о написании специального конвертера, который будет более осторожным с этим.

Вы сможете найти инструкции по написанию собственного конвертера в Интернете. Вот пример:

Как реализовать пользовательский JsonConverter в JSON.NET для десериализации списка объектов базового класса?

person Youssef Moussaoui    schedule 19.12.2012