首页 > 解决方案 > 在 asp.net 核心中替代 HttpConfigurationExtensions.BindParameter

问题描述

我正在寻找 ASP .NET 核心中的替代HttpConfigurationExtensions.BindParameter方法来替代 .NET 框架 MVC 中的方法。

我正在尝试为我拥有的枚举创建模型绑定器。我希望有与默认行为不同的行为。

在 .net 框架中,我会这样做。

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并尝试实现它。不幸的是,如果我使用 a ModelBinderProvider,它只会触发MyRequestObject类型而不是触发,MyEnum所以我不能只针对MyEnum类型。

有任何想法吗?

标签: c#asp.netasp.net-coremodel-view-controller.net-core

解决方案


为什么不使用 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()));
        }

推荐阅读