首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何编写按前缀访问所有字段的ModelBinder?

按前缀访问所有字段的ModelBinder是用于将HTTP请求中以特定前缀命名的字段值绑定到模型对象的一种技术。以下是如何编写这样一个ModelBinder的步骤:

  1. 创建一个继承自IModelBinder接口的自定义ModelBinder类,例如PrefixModelBinder
  2. 在自定义ModelBinder类中实现BindModelAsync方法,该方法接收一个ModelBindingContext对象和一个CancellationToken参数。
  3. BindModelAsync方法中,首先获取模型类型,可以通过ModelMetadata对象的ModelType属性获得。
  4. 接着,获取HTTP请求的Form集合或QueryString集合中的所有字段。
  5. 使用LINQ查询筛选出符合指定前缀的字段。可以使用StartsWith方法进行前缀匹配。
  6. 遍历筛选后的字段,将它们的值分别赋给模型对象的对应属性。可以使用ModelMetadata对象的PropertyGetter方法获取属性的getter方法,并使用反射调用setter方法来赋值。
  7. 最后,将绑定后的模型对象通过ModelBindingContext对象的Result属性返回。

下面是一个简单的示例代码:

代码语言:txt
复制
public class PrefixModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var modelType = bindingContext.ModelType;
        var formFields = bindingContext.HttpContext.Request.Form;

        var prefix = "prefix"; // 指定的前缀
        var prefixedFields = formFields.Where(f => f.Key.StartsWith(prefix));

        var model = Activator.CreateInstance(modelType);
        var modelProperties = modelType.GetProperties();

        foreach (var field in prefixedFields)
        {
            var fieldName = field.Key.Substring(prefix.Length);
            var property = modelProperties.FirstOrDefault(p => p.Name.Equals(fieldName, StringComparison.OrdinalIgnoreCase));

            if (property != null)
            {
                var value = field.Value.ToString();
                var setter = property.SetMethod;

                setter.Invoke(model, new object[] { Convert.ChangeType(value, property.PropertyType) });
            }
        }

        bindingContext.Result = ModelBindingResult.Success(model);
        return Task.CompletedTask;
    }
}

请注意,这只是一个简单示例,实际应用中可能需要根据具体需求进行适当的修改和优化。

推荐腾讯云的相关产品:云服务器(CVM)云数据库 MySQLCDN 加速等,更多产品信息可以在腾讯云官网上找到。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何用 JS 一次获取 HTML 表单所有字段

---- 问:如何用 JS 一次获取 HTML 表单所有字段 ?...用户单击“提交”按钮后,我们如何从此表单中获取所有数据? 有两种方法:一种是用黑科技,另一种是更清洁,也是最常用方法。为了演示这种方法,我们先创建form.js,并引入文件中。...然后,使用this.elements或event.target.elements访问表单字段: 相反,如果需要响应某些用户交互而动态添加更多字段,那么我们需要使用FormData。...总结 要从HTML表单中获取所有字段,可以使用: this.elements或event.target.elements,只有在预先知道所有字段并且它们保持稳定情况下,才能使用。...使用FormData构建具有所有字段对象,之后可以转换,更新或将其发送到远程API。* ---- 原文:https://www.valentinog.com/bl...

5K20

告别硬编码,mysql 如何实现字段不同取值进行统计

上周我突然意识到,我在grafana上写 sql 语句存在多处硬编码。这篇笔记将记录如何实现没有硬编码sql语句,以及自学编程过程中如何应对自己笨拙代码和难题不断状况。...情境A:字段取值范围在同一表格 想要统计原数据,和该字段所有取值范围,在同一张数据表时,代码简单如下。...group by 成就名称 order by 成就名称 情境B:字段取值范围在另一表格 想要统计原数据,和该字段所有取值范围,不在同一张数据表时,代码仅稍微复杂一点点。...小结 在这篇笔记中,我不仅记录了自己如何完成某个字段取值范围进行统计需求,既有早期硬编码风格,也有升级版语句。...我还分享了自己如何看待初学编程时笨拙代码,如何应对一个难题接着一个难题编程自学过程。希望我笔记,带给你启发和力量。

2.6K10
  • 问与答62: 如何指定个数在Excel中获得一列数据所有可能组合?

    excelperfect Q:数据放置在列A中,我要得到这些数据中任意3个数据所有可能组合。如下图1所示,列A中存放了5个数据,要得到这5个数据中任意3个数据所有可能组合,如列B中所示。...如何实现? ? 图1 (注:这是无意在ozgrid.com中看到一个问题,我觉得程序编写得很巧妙,使用了递归方法来解决,非常简洁,特将该解答稍作整理后辑录于此与大家分享!)...A Set rng =Range("A1", Range("A1").End(xlDown)) '设置每个组合需要数据个数 n = 3 '在数组中存储要组合数据...,有兴趣朋友可以使用F8键逐语句运行代码观察代码效果,来理解实现过程。...代码图片版如下: ? 如果将代码中注释掉代码恢复,也就是将组合结果放置在多列中,运行后结果如下图2所示。 ? 图2

    5.6K30

    通过实例模拟ASP.NET MVCModel绑定机制:简单类型+复杂类型

    总的来说,针对目标Action方法参数Model绑定完全由组件ModelBinder来实现,在默认情况下使用ModelBinder类型为DefaultModelBinder,接下来我们将按照逐层深入方式介绍实现在...Action方法ActionDescriptor获取最终执行该方法所有参数值。...一个Contact对象数据结构可以通过如下图所示树来表示,这个树种所有叶子节点均为简单类型。...如果我们需要通过一个ValueProvider来构建一个完整Contact对象,它必须能够提供所有所有叶子节点数值,而ValueProvider通过基于属性名称前缀Key实现与对应叶子节点映射...通过CreateModel方法创建是针对参数类型“空”对象,我们需要通过Model绑定对它相关属性进行初始化。在BindModel方法中,我们遍历参数类型所有属性,并在现有前缀基础上加上“.

    1.9K80

    WebAPI下的如何实现参数绑定

    本文将概述在WebAPI方式下将如何将参数绑定到一个action方法,包括参数是如何被读取,一系列规则决定特定环境采用那种绑定方式,文章最后将给出一些实际例子。...请求消息(request message)包括了请求所有信息,如带查询字符串请求地址(URL),内容主体(content body)及头部信息(header)。...以下这些基本原则决定了parameter是通过modelbinding还是formatter来读取: 如果参数未添加任何特性字段[attribute]标明,那么这将由参数.NET类型来决定具体采用何种方式...[FromUri]是一个从[ModelBinder]继承而来 实体,用于配置model binder只应用到URL中数据。 body只能被读取一次。...示例 以下给出一些不同请求示例说明它们将如何映射到特定action签名: /?

    1.5K60

    ASP.NET Core 2.2 十九. 你扔过来个json,我怎么接

    invoker创建阶段,创建处理方法,并根据目标ActionactionDescriptor获取到它所有参数,分析各个参数类型确定对应参数绑定方法,        invoker执行阶段,调用处理方法...创建绑定方法  当收到请求后,由路由系统确定了被访问目标Action是我们定义Test方法, 这时进入invoker创建阶段,前文说过它有一个关键属性cacheEntry是由多个对象组装而成(发生在...public ModelMetadata ModelMetadata { get; } } 通过遍历目标Action所有参数actionDescriptor.Parameters,根据参数逐一匹配一个对应定处理对象...注意这里传入了 bindingInfo.ModelBinder ,在parameterBinder中会调用传入modelBinderBindModelAsync方法 modelBinder.BindModelAsync...等具体ModelBinder了。

    75630

    ASP.NET MVC5 ModelBinder

    什么是ModelBinding ASP.NET MVC中,所有的请求最终都会到达某个Controller中某个Action并由该Action负责具体处理和响应。...核心是IModelBinder,默认实现类是DefaultModelBinder,我们可以自己实现IModelBinder接口来扩展ModelBinder IValueProvider针对不同数据源提供了数据访问机制...经过上述一系列处理获取最终结果 自定义ModelBinder 自定义Modelbinder只需实现System.Web.Mvc.IModelBinder接口即可。...),new LessonEditInfoViewModelBinder()); 不同ModelBinder提供策略有不同优先级,具体如下: 在参数上使用CustomModelBinderAttribute...玩转Asp.net MVC 八个扩展点 ASP.NET MVC中你必须知道13个扩展点 版权声明 本文为作者原创,版权归作者雪飞鸿所有

    1.4K20

    .NET 云原生架构师训练营(模块二 基础巩固 MVC终结点)--学习笔记

    编写代码以检索这些值,并将其从字符串转换为 .NET 类型不仅繁琐,而且还容易出错。 模型绑定会自动化该过程。模型绑定系统: 从各种源(如路由数据、表单域和查询字符串)中检索数据。...更新复杂类型属性。 来源有哪些 [FromQuery] -从查询字符串获取值。 [FromRoute] -从路由数据中获取值。 [FromForm] -从已发布表单字段中获取值。...[FromQuery] string name,[FromHeader] string termId) { return Ok(new {id, name, termId}); } 从已发布表单字段中获取值...view=aspnetcore-5.0 ModelBinder [ModelBinder(BinderType = typeof(AuthorEntityBinder))] public class Author...[Range]:验证属性值是否在指定范围内。 [RegularExpression]:验证属性值是否与指定正则表达式匹配。 [Required]:验证字段是否不为 null。

    2.5K10

    .NET 云原生架构师训练营(模块二 基础巩固 MVC终结点)--学习笔记

    编写代码以检索这些值,并将其从字符串转换为 .NET 类型不仅繁琐,而且还容易出错。 模型绑定会自动化该过程。 模型绑定系统: 从各种源(如路由数据、表单域和查询字符串)中检索数据。...更新复杂类型属性。 来源有哪些 [FromQuery] -从查询字符串获取值。 [FromRoute] -从路由数据中获取值。 [FromForm] -从已发布表单字段中获取值。...[FromQuery] string name,[FromHeader] string termId) { return Ok(new {id, name, termId}); } 从已发布表单字段中获取值...view=aspnetcore-5.0 ModelBinder [ModelBinder(BinderType = typeof(AuthorEntityBinder))] public class Author...[Range]:验证属性值是否在指定范围内。 [RegularExpression]:验证属性值是否与指定正则表达式匹配。 [Required]:验证字段是否不为 null。

    2.6K11

    【愚公系列】2022年03月 .NET CORE工具案例-短链接服务

    2、强大数据功能 在短信中置入短链接,可以对短信点击效果进行统计分析,进而能够判定短信发送效果如何,为会员运营及精细化管理提供辅助依据。...短链接服务实现原理如下: 1、用户访问短链接,请求到达服务器; 2、服务器将短链接转换成为长链接,然后给浏览器返回重定向状态码302; 3、浏览器拿到重定向状态码,以及真正需要访问地址,重定向到真正长链接上...在这里,通过编写一个自定义JsonConverter来实现: public class HashIdJsonConverter : JsonConverter { Hashids hashids...IEnumerable Get() { return new[] { new UserDto { Id = 12345, Name = "用户12345" } }; } 2.自定义模型绑定 编写一个自定义...hashids.Decode(str)[0]); return Task.CompletedTask; } } 运行 [HttpGet("{id}")] public UserDto Get([ModelBinder

    40710

    如何让WordPress所有请求只需要通过Nginx处理,不经过PHP和Mysql,从而加快站点访问速度?

    php-fpm进程运行指定php脚本 -> 判断是否存在缓存文件  -> 输出缓存文件内容给Nginx ->  Nginx响应本次请求 相较于没有缓存情况,大大减少了Mysql查询次数,所有文件缓存是比较流行一种方式...  直接响应本次请求缓存文件 页面生成缓存之后,响应请求不再经过PHP和Mysql等以外程序,直接通过Nginx完成所有事情。...: /* 如果访问不是后台 */ if(strpos($_SERVER['REQUEST_URI'],"wp-admin") === false){ ob_start( function ( $html...如果缓存文件存在,将会在cached目录内匹配到请求目录,然后直接响应用户请求。 3.最后总结 还有很多细节需要完善,比如如何处理缓存更新,比如有些主题移动端、PC端页面代码不一致时如何处理等等。...但是总得来说,通过这种方式加速后,访问速度能快一个量级。

    70730

    MySQL学习——优化

    在系统性能问题中,数据库往往是性能瓶颈关键因素。那么如何去检测mysql性能问题,如何构建高性能mysql,如何编写出高性能sql语句?为此,整理一些建议。...大于>、大于等于>=、小于<、小于等于<=使用索引视情况而定,如果字段是字符串,则不使用索引,如果是 索引优化 B-Tree 1、结构描述: (1)所有的值都是顺序存储,每一个叶子节点到根距离相同...B-Tree能够加快访问速度,因为条件查询数据时,如果满足索引查询条件,存储引擎不需要进行全表扫描,而是从索引根节点开始进行搜索。根节点中存放了指向子节点指针,存储引擎根据这些指针向下层查找。...key_len计算. (1)所有的索引字段,如果没有设置not null,则需要加一个字节。 (2)定长字段,int占四个字节、date占三个字节、char(n)占n个字符。...GROUP BY或DISTINCT查询所有列,而不要额外搜索硬盘访问实际表。

    74010

    卸载 Navicat!事实已证明,正版客户端,它更牛逼……

    点击上方 好好学java ,选择 星标 公众号 重磅资讯、干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年经验告诉你如何准备校招!...,datagrip会自动提示,此时对着有问题表名或字段名,下Alt+Enter,会自动提示是否创建表或添加字段 权限定字段名 对于查询使用表别名,而字段中没有使用别名前缀,datagrip能自动添加前缀...,鼠标停留在需要添加别名前缀字段上,使用Alt+Enter快捷键 ?...*通配符自动展开 查询时候我们会使用select 查询所有列,这是不好习惯,datagrip能快速展开列,光标定位到后面,下Alt+Enter快捷键 ?...,会出现多个光标 智能代码 完成DataGrip提供上下文相关代码完成,帮助您更快地编写SQL代码。

    5K10

    dotNET Core 3.X 使用 Web API

    在我们实际开发中,通常会自定义添加一个所有 Controller 类基础类,一些通用功能可以放到基类中,比如,对 AutoMapper 注入,代码如下: public class BaseController...FluentValidation FluentValidation 就不多做介绍了,可以参见官方文档:https://fluentvalidation.net/ ModelBinder ModelBinder...同样接口在前端不同场景下需要返回不一样字段数据,一种方式是创建很多不同接口,返回不同 Dto 结果,但这样做非常繁琐,可以通过 ExpandoObject 来实现客户端需要进行返回结果,...具体步骤如下: 1、因为获取用户列表接口方法是 List,所以先创建一个 IEnumerable 扩展方法,该扩展方法用于根据传进字段参数来组装返回结果,代码如下: public static...返回所有 ? 最后 本文只是涉及了在 Web API 中比较常用一些功能点,限于篇幅,每个点并没有写非常深入,也较少涉及原理,但我们在学习过程中,除了实现效果外还应该深入去了解其中细节和原理。

    1.6K30
    领券