Альтернатива HttpConfigurationExtensions.BindParameter в ядре asp.net - PullRequest
0 голосов
/ 25 мая 2019

Я ищу альтернативу в ядре ASP .NET методу HttpConfigurationExtensions.BindParameter из .NET Framework MVC.

Я пытаюсь создать связующее для модели для моего перечисления.Я хотел бы иметь другое поведение, чем по умолчанию.

В .NET Framework я бы сделал это.

config.BindParameter(typeof(MyEnum), new MyEnumBinder());

Я мог бы тогда использовать это перечисление внутри моего класса объекта запроса.Как это.

public class MyRequestObject 
{
    public string ExampleProp { get; set; }
    public MyEnum ExampleEnum { get; set; }
}

Как я могу сделать то же самое в ядре ASP .Net?

Я посмотрел на это https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-2.2 и попытался реализовать его.К сожалению, если я использую ModelBinderProvider, он срабатывает только для типа MyRequestObject, а не для MyEnum, поэтому я не могу выбрать только тип MyEnum.

Есть идеи?

1 Ответ

0 голосов
/ 25 мая 2019

Почему бы не использовать JsonConverter вместо связывателя модели?

Проверьте это:

public enum ElapsedTime
    {
        Unknown = 1,
        SomeSeconds = 2,
        LessThanTenMinutes = 3,
        LessThanThirtyMinutes = 4,
        LessThanAnHour = 5,
        MoreThanAnHour = 6
    }

Реализация JsonConverter:

public class ElapsedTimeJsonConverter : JsonConverter<ElapsedTime>
    {
        public override ElapsedTime ReadJson(JsonReader reader, Type objectType, ElapsedTime existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            if (!DateTime.TryParse(reader.ReadAsString(), out var date))
                return ElapsedTime.Unknown;

            var elapsedTime = default(ElapsedTime);
            var timeDifference = date.Subtract(DateTime.Now).TotalMinutes;

            if (timeDifference < 1)
            {
                elapsedTime = ElapsedTime.SomeSeconds;
            }
            else if (timeDifference >= 1 && timeDifference < 10)
            {
                elapsedTime = ElapsedTime.LessThanTenMinutes;
            }
            else if (timeDifference >= 10 && timeDifference < 30)
            {
                elapsedTime = ElapsedTime.LessThanThirtyMinutes;
            }
            else if (timeDifference >= 30 && timeDifference < 60)
            {
                elapsedTime = ElapsedTime.LessThanAnHour;
            }
            else if (timeDifference >= 60)
            {
                elapsedTime = ElapsedTime.MoreThanAnHour;
            }

            return elapsedTime;

        }

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

И запуск:

public void ConfigureServices(IServiceCollection services)
        {

            //Only for preventing validation errors
            services.AddSingleton<IObjectModelValidator>(new NullObjectModelValidator());
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .AddJsonOptions(options => options.SerializerSettings.Converters.Add(new ElapsedTimeJsonConverter()));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...