Дата публикации (дд / мм / гггг) и значения с плавающей запятой (запятая) в aspnet WebApi

Эта проблема

Когда я публикую данные jSon в webapi, используя форматы pt-br (дд / мм / гггг для даты и десятичный разделитель запятой для числа с плавающей запятой), значения десериализуются в формате en-us, что приводит к ошибке.

т.е.

"Дата: публикация 23.01.2013 стала 01.010001

"Плавать: размещение 1,4 стал 0,0

Запрос на помощь

Может ли кто-нибудь помочь мне определить "окончательное" решение для публикации данных в веб-API, используя другие культуры, кроме en-US. Я прочитал несколько обсуждений, но ни одно из них не представляет полного решения или даже рабочего решения.

Учитывая следующее

Модель:

public class Person
{
    public Datetime BirthDate { get; set; }
    public double Weight { get; set; }
}

Метод ApiController

public HttpResponseMessage Create(Person person)
{
    // ...
}

AjaxCall

$.ajax({
    type: 'POST',
    url: sl.baseUri + "/create",
    data: "Weight=87%2C7&BirthDate=17%2F07%2F1981",
    success: null,
    dataType: "json",
})

** Я уже добавил следующие параметры глобализации в web.config

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="pt-BR" uiCulture="pt-BR"/>

2 ответа

Решение

Чтобы решить эту проблему, я создал пользовательскую привязку для дат.

    ko.bindingHandlers.date = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        ko.utils.registerEventHandler(element, 'change', function () {
            var value = valueAccessor();

            if (element.value !== null && element.value !== undefined && element.value.length > 0) {
                value(element.value);
            }
            else {
                value('');
            }
        });
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var value = valueAccessor();
        var valueUnwrapped = ko.utils.unwrapObservable(value);

        var output = '';
        if (valueUnwrapped !== null && valueUnwrapped !== undefined && valueUnwrapped.length > 0) {
            output = moment(valueUnwrapped).format('YYYY-MM-DD');
        }

        if ($(element).is('input') === true) {
            $(element).val(output);
        } else {
            $(element).text(output);
        }
    }
};

Эта привязка сохраняет дату в следующем формате: 2014-11-05T00:00:00-02:00 Рекомендуется использовать тип ввода = дата в html.

Кроме того, вам нужно включить библиотеку moment.js в ваш проект.

Вы можете попробовать опубликовать его как объект JSON, а не просто строку:

{"BirthDate": "17/07/1981", "Weight": "87,7"}

Однако вам нужно будет сообщить Json.Net, какой формат даты ожидать: http://james.newtonking.com/archive/2009/02/20/good-date-times-with-json-net.aspx

Другие вопросы по тегам