ASP.NET Core 3.1中QueryString字符串参数的自定义模型绑定器? [英] Custom model binder for QueryString string parameters in ASP.NET Core 3.1?

查看:70
本文介绍了ASP.NET Core 3.1中QueryString字符串参数的自定义模型绑定器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望为某些数据类型实现一些/任何自定义行为,例如DateTimeint

我已经创建了一个自定义JsonConverter,它包含从请求正文接收的数据(除非它被指定为非json),这就允许我这样做。

但如果数据在请求的查询字符串中传递,例如?param1=helloWorld&param2=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字符串参数的自定义模型绑定器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆