Конвертировать всю строку с тысячами символов-разделителей в int, во всех свойствах int всех моделей .Net Core? - PullRequest
0 голосов
/ 04 декабря 2018

Я работаю с .Net Core MVC 2.1
На наш взгляд, у нас есть цена с разделителем тысяч, например 2,500,000
. Я хочу получить все из них в наших внутренних моделях как INT.Я имею в виду без ,.
Я хочу написать что-то вроде middleware, чтобы сделать это без атрибута ModelBinder для каждого свойства int.
Как мы можем это сделать?

1 Ответ

0 голосов
/ 04 декабря 2018

Создайте класс, полученный из JsonConverter, аналогично этому (может потребоваться дополнительная проверка в ReadJson):

public class FormattedStringToIntConverter : JsonConverter
{
    public override bool CanRead => true;

    public override bool CanWrite => false;

    public override bool CanConvert(Type objectType) => objectType == typeof(string);

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var token = JToken.Load(reader);
        int.TryParse(token.ToString(), NumberStyles.AllowThousands, CultureInfo.CreateSpecificCulture("en-US"), out var value);
        return value;
    }
}

Теперь вы можете добавить атрибут в свойства вашей модели, где вы хотите использовать этот конвертер:

[JsonConverter(typeof(FormattedStringToIntConverter))]

Или, если вы хотите проверить все строки, вы можете изменить файл Startup.cs для включения некоторых JsonOptions:

services.AddMvc().AddJsonOptions(o => {
    o.SerializerSettings.Converters.Add(new FormattedStringToIntConverter());
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

Вы можете добавить дополнительную логику в CanConvert, чтобы попытаться преобразовать толькостроки, которые действительно содержат число.

...