ASP.NET Core 3.1中QueryString字符串参数的自定义模型绑定器?

Custom model binder for QueryString string parameters in ASP.NET Core 3.1?(ASP.NET Core 3.1中QueryString字符串参数的自定义模型绑定器?)
本文介绍了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字符串参数的自定义模型绑定器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)