本文介绍了ASP.NET Core 3.1中QueryString字符串参数的自定义模型绑定器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望为某些数据类型实现一些/任何自定义行为,例如DateTime
或int
。
我已经创建了一个自定义JsonConverter
,它包含从请求正文接收的数据(除非它被指定为非json),这就允许我这样做。
但如果数据在请求的查询字符串中传递,例如?param1=helloWorld¶m2=123"
,则它们的处理方式不同,不在我的自定义JsonConverter
范围内。
我读过有关创建/实现我自己的自定义模型绑定器的内容,但从它的外观来看,这些是针对复杂类型的,所以我有点不知道如何准确地修改传入的查询字符串参数,或者如果不可能的话-获得对整个查询字符串的访问权限,搜索我想要修改的参数,然后修改这些参数。(与Action
方法分离,类似于筛选器等。)
谢谢!
推荐答案
创建/实现我自己的自定义模型绑定器,但从外观上看,这些绑定器是针对复杂类型的,因此我对如何准确地修改传入的查询字符串参数有点迷茫
您可以创建自定义模型绑定器并将其应用于简单类型参数,如下所示。
public IActionResult Test(string param1, [ModelBinder(BinderType = typeof(Param2ModelBinder))]int param2)
{
与Action方法分离,类似于筛选器等。
如果不想将自定义模型绑定器直接应用于操作参数,可以实现自定义模型绑定器提供程序并指定绑定器操作的参数,然后将其添加到MVC的提供程序集合中。
Param2ModelBinder类
public class Param2ModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
// ...
// implement it based on your actual requirement
// code logic here
// ...
var model = 0;
if (bindingContext.ValueProvider.GetValue("param2").FirstOrDefault() != null)
{
model = JsonSerializer.Deserialize<int>(bindingContext.ValueProvider.GetValue("param2").FirstOrDefault());
// just for testing purpose
// if received data > 100
// set it to 100
if ((int)model > 100)
{
model = 100;
}
}
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
MyCustomBinderProvider类
public class MyCustomBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
// specify the parameter your binder operates on
if (context.Metadata.ParameterName == "param2")
{
return new BinderTypeModelBinder(typeof(Param2ModelBinder));
}
return null;
}
}
添加自定义模型绑定器提供程序
services.AddControllersWithViews(opt=> {
opt.ModelBinderProviders.Insert(0, new MyCustomBinderProvider());
});
测试结果
这篇关于ASP.NET Core 3.1中QueryString字符串参数的自定义模型绑定器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!