c# - 在 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
类型。
有任何想法吗?
解决方案
为什么不使用 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()));
}
推荐阅读
- angular - 错误 TS2345:“SpyObj”类型的参数
' 不可分配给“路由器”类型的参数 - angularjs - 即使使用点符号,两种方式绑定也不起作用
- c# - 在 Visual Studio 2017 社区中突出显示匹配大括号
- laravel - 在 Google App Engine 上部署的 Laradock 无法正常工作
- reactjs - 如何将样式应用于 JSS 中的子类
- wso2 - 在 ESB 配置文件的 wso2 ei 6.4 分析数据库配置中,需要哪些数据库/模式
- c# - TeamCity,没有“找到”构建服务器上的 microsoft 规则集,这会导致警告
- android - 如何在 Firebase 消息传递服务中添加视图?
- ansible - 无需 Internet 访问的 Ansible 配置
- sql - 银行账户交易报告(表格)