首页 > 编程语言 >【asp.net core】自定义模型绑定及其验证

【asp.net core】自定义模型绑定及其验证

时间:2023-05-09 15:14:49浏览次数:55  
标签:core asp 自定义 验证 实现 绑定 接口 public

引言

    水此篇博客,依旧是来自群里的讨论,最后说到了,在方法参数自定义了一个特性,用来绑定模型,优先从Form取,如果为空,或者不存在,在从QueryString中获取并且绑定,然后闲着无聊,就水一篇博客,如果大家有什么需求或者问题,可以找我,很高兴能为你们带来帮助。

IModelBinderFactory

    总共也没有多少代码,关键其实也就是在于三个接口而已。第一个接口就是模型绑定工厂接口,继承这个接口,然后实现创建IModelBinder接口的实例即可,当然可以看到我们需要实现IModelBinder接口,在这个接口中,我们就new一个TestBinder就行了,只实现效果,不涉及业务,然后在绑定的时候会调用到BindModelAsync方法,然后在此处你可以实现自定义模型绑定,可以结合Required或者Email,MaxLength特性,结合HttpCotnext实现自己的一个模型绑定。

public class TestBinderFactory : IModelBinderFactory
{

    public IModelBinder CreateBinder(ModelBinderFactoryContext context)
    {
        return new TestBinder();
    }
}
public class TestBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        bindingContext.Model = new TestModel() { };
       bindingContext.Result = ModelBindingResult.Success(bindingContext.Model);
        return Task.CompletedTask;
    }
}

IObjectModelValidator

    在模型绑定之后,还需要实现自定义的一个验证,在默认情况下,如果使用自己去验证,且你绑定好的模型里有属性为null,则会提示the propertyname is required,就是这个属性是必须的,就需要在此处实现一个自定义验证,让通过验证,如果有需要你还需要实现IValidationStrategy接口,用来对模型内部的各个子项属性进行验证,当然如果不需要验证的话可以直接走默认的,即实现了这个接口,但不写Validate的方法体,空方法就行,如果需要就自己实现就行了,同时将自己实现的接口注入到容器,替换掉自带的就可以实现自定义模型绑定和验证了。

public class Validator : IObjectModelValidator
{
    public Validator(IModelMetadataProvider modelMetadataProvider)
    {
        ModelMetadataProvider = modelMetadataProvider;
    }

    public IModelMetadataProvider ModelMetadataProvider { get; }

    public void Validate(ActionContext actionContext, ValidationStateDictionary? validationState, string prefix, object? model)
    {
        //var data=ModelMetadataProvider.GetMetadataForType(model.GetType());
        //var entry=new  Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationStateEntry();
        //entry.Key = "Name";
        //entry.Metadata = data;
        //validationState.Add("Name", entry);
    }
}
builder.Services.AddSingleton<IObjectModelValidator, Validator>();
builder.Services.AddSingleton<IModelBinderFactory, TestBinderFactory>();

结尾

    本博客仅提供思路以及部分接口实现,不涉及任何业务,如果在asp.net core中需要自定义实现什么,此处提供几个思路,

    1:去api浏览器,找到对应的相关接口,传送门

    2:然后在启动的时候,在service全部注入之后,打断点,找到和你要实现自定义相关的接口或者实例即可。

    3:根据第二步找到的相关注入类型,在api浏览器找到对应的,实现这个接口然后注入进去即可,源码中所有的都是tryadd,所以不用担心冲突,存在多种实现的也都是集合类型的。

    4:接下来就是调试运行,就行了。

    当然有能力者,可以直接去阅读源码实现即可,思路往往比具体的实现更重要。

 

标签:core,asp,自定义,验证,实现,绑定,接口,public
From: https://www.cnblogs.com/1996-Chinese-Chen/p/17385061.html

相关文章

  • mybatis 自定义序列号
    功能需求:每天的序列号从1开始,保留四位数,不足4位往前补01,新建一张表 CREATETABLE`sequence`(`day_id`dateDEFAULTNULLCOMMENT'账期',`name`varchar(50)COLLATEutf8mb4_binNOTNULLCOMMENT'序列的名字',`current_value`int(11)NOTNULLCOMMENT'序列......
  • C#自定义异常就这么简单
    C#是一种强类型语言,可以捕获和处理各种异常,从而帮助我们发现程序中出现的错误。在程序开发过程中,如果需要找到特定的错误情况并处理,这时就需要创建自定义异常。本文将介绍如何在C#中创建和使用自定义异常。1、什么是异常?异常是指在程序执行期间发生的错误或异常情况,例如除法中除......
  • 【HMS Core】Health Kit想要查看数据是来自用户的哪个设备,如何查看?
     【问题描述1】如何查看运动健康数据是来自用户的哪个设备?【解决方案】可以通过返回的数据中携带的dataCollectorId来查询提供数据的设备信息:请求示例(以查询睡眠记录详情为例):1、查询睡眠记录并关联睡眠状态采样数据:​2、根据关联采样数据返回的dataCollectorId调用查询指......
  • 使用 Ef core 时 报错Data is Null. This method or property cannot be called on
    1.问题在使用EFcore做查询操作的时候报错"DataisNull.ThismethodorpropertycannotbecalledonNullvalues.”"2.解决这是数据库中的某个属性为空导致,即使这个属性srting类型,也需要将字段标记为可空的......
  • kali Metasploit导入模块
    比如对于漏洞CyberLinkLabelPrint2.5-StackBufferOverflow(Metasploit)-WindowslocalExploit(exploit-db.com)首先从Exploit-DB下载45985.rb文件,该文件是ruby写的metasploit模块,用来复现攻击将模块复制到metasploit的渗透攻击模块目录cd/usr/share/metasploit-fr......
  • mac版DataSpell2023:专业数据科学家的 IDE,macbook程序员必备
    DataSpell2023forMac是一款强大的数据科学工具,它提供了广泛的功能和工具,帮助用户更好地分析、处理和可视化数据。无论是数据分析师、数据科学家、商业分析师还是研究人员,DataSpellforMac都是一个理想的选择。mac软件下载:https://mac.macsc.com/mac/4116.html?id=MzI1OTY2......
  • vue2自定义组件@click点击失效问题及解决
    1.参照官方文档,可以用@click.native=“click”解决2.$emit组件之间事件传递解决https://www.jb51.net/article/246610.htm......
  • C# .net core 返回json 中文字符编码被转换或乱码问题
    开发环境VS2022+.NET6.0现象接口返回Json中文数据时出现乱码。例如后台返回结果:"0506133015\u56FE\u8868\u9009\u62E9.png"。解决办法以下方法任选其一即可。//方法1:在Program.cs中添加以下代码varbuilder=WebApplication.CreateBuilder(args);builder.Services.Ad......
  • How to use Linux command or Python code get Raspberry PI's Temperature All In On
    HowtouseLinuxcommandorPythoncodegetRaspberryPI'sTemperatureAllInOne如何使用Linux命令或Python代码获取RaspberryPI的温度raspberrypicheckthetemperatureimportgpiozeroasgz#readthetemperatureintoavariable:cpu_temp=gz.CPUTe......
  • How to connect to multiple SSD1306 OLED Displays using Raspberry Pi GPIO I2C PIN
    HowtoconnecttomultipleSSD1306OLEDDisplaysusingRaspberryPiGPIOI2CPINAllInOne如何使用RaspberryPi的GPIOI2CPIN连接多个SSD1306OLED显示器demos(......