Asp. Net культуры различаются по GET и POST - PullRequest
1 голос
/ 14 января 2020

Я установил культуру моего Asp. Net Базового приложения на немецкий язык так:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
{
    var supportedCultures = new[] { new CultureInfo("de-DE") };

    app.UseRequestLocalization(new RequestLocalizationOptions
    {
        DefaultRequestCulture = new RequestCulture("de-DE"),
        SupportedCultures = supportedCultures,
        SupportedUICultures = supportedCultures
    });

    ...
}

Когда я отправляю значение с помощью Postman, это работает отлично, и все анализируется правильно. Например, если я отправляю значение типа 0,76, оно отлично анализируется до 0,76. Однако, когда я делаю запрос GET к моей конечной точке API, он возвращает значение 0,76. Конечно, это не немецкая культура и показывает некоторую несогласованность в моем API. Разработчик, отправляющий и получающий данные в и из моего API, должен всегда иметь один и тот же формат, который должен соответствовать немецкой культуре.

Это поведение по умолчанию или оба формата должны быть одинаковыми?

РЕДАКТИРОВАТЬ:

Ниже приведен скриншот, который показывает, что для запроса GET десятичный разделитель по-прежнему является точкой, а не запятой. Однако, когда я отправляю данные с пост-запросом, данные форматируются правильно, используя запятую в качестве десятичного разделителя вместо точки.

enter image description here

Ответы [ 2 ]

1 голос
/ 14 января 2020

здесь: https://forums.asp.net/t/2119989.aspx?JSON+formatter+and+Localization+settings

недействительно json ...

"netValue": 120,00,
"grossValueAdded": 147,60,

действует json

"netValue": 120.00,
"grossValueAdded": 147.60,

вы можете конвертировать все ваши десятичные дроби в строки и использовать манипуляции со строками (не рекомендую), просто оставаясь

"netValue": "120,00",
"grossValueAdded": "147,60",
0 голосов
/ 15 января 2020

Я понял, почему он так себя ведет. Во-первых, так выглядит моя модель:

public class someDTO
{
    public int Id { get; set; }
    public int AuftragId { get; set; }
    public string Typ { get; set; }
    public decimal KundeBrutto { get; set; }
    public decimal KundeNetto { get; set; }
    public decimal KundeMwSt { get; set; }
    public decimal FahrerBrutto { get; set; }
    public decimal FahrerNetto { get; set; }
    public decimal FahrerMwSt { get; set; }
    public decimal MwStSatz { get; set; } = (decimal)0.19;
    public string MwStLand { get; set; } = "DE";
    public string FileName { get; set; }
    public string FileUrl { get; set; }
}

Очевидно, что некоторые из этих свойств имеют тип decimal. Если я верну данные из GET, Asp. Net отправит обратно JSON с данными. Как упоминал Seabizkit, свойство типа decimal всегда отделяется точкой, поскольку оно является встроенным типом. Поэтому культура не имеет значения.

Мне было интересно, однако, почему я должен посылать данные с немецкой культурой? В соответствии с требованиями моего приложения, мне нужно отправить файл вместе с этими данными, поэтому мы решили сделать запрос типа form-data. Недостаток данных формы в том, что все, что вы отправляете, будет иметь тип string и не будет иметь тип данных. Когда Asp. Net видит строку, он пытается отобразить это значение из строки в десятичную. При этом предполагается, что отправленная строка имеет формат культуры, применяемой к серверу. Например, в моем случае я установил на сервере язык «German», и поэтому значение, например «47,11», будет правильно отображаться на 47.11.

Однако, если вы решите отправить данные типа JSON внутрь ваше тело, вы, конечно, можете сделать эти свойства типа десятичными, и, следовательно, вы можете отправить их через точку. Таким образом вы преодолеете проблему отправки / получения данных в разных культурах:

enter image description here

Надеюсь, это имеет смысл!

...