在上一篇中,老周演示了通过实现约定接口的方式自定义控制器的名称。

至于说自定义操作方法的名称,就很简单了,因为有内置的特性类可以用。看看下面的例子。

    [Route("[controller]/[action]")]
public class StockController : Controller
{
[ActionName("OutGoing"), HttpGet("{q?}")]
public string Sendout(int q) => $"今天发出{q}笔订单";
}

上述代码中,本来操作方法的名称是“Sendout”,但应用了 ActionName 特性后,就变成“OutGoing”了。访问 /stock/outgoing/12 试试看。

如何?简单吧。可是有大伙伴会说,那我用实现约定接口的方式能实现吗?能,扩展的是 IActionModelConvention 接口,修改 ActionModel 实例的 ActionName 属性就可以了。请参考下面代码:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MyActionNameAttribute : Attribute, IActionModelConvention
{
private readonly string _actionName; public MyActionNameAttribute(string Name)
{
_actionName = Name;
} public void Apply(ActionModel action)
{
action.ActionName = _actionName;
}
}

然后,咱们用自己定义的这个特性类替换 ActionName 特性。

    [Route("[controller]/[action]")]
public class StockController : Controller
{
[MyActionName("OutGoing"), HttpGet("{q?}")]
public string Sendout(int q) => $"今天发出{q}笔订单";
}

效果是一样的哟。

------------------------------------------------------------------ 银河分隔线 ----------------------------------------------------------------

控制器和操作方法的自定义名称好弄,但,方法参数的名称就不好弄了。有大伙伴就不乐意了,我直接按思路套代码不就行了吗?扩展下 IParameterModelConvention 接口,然后设置 ParameterModel.ParameterName 属性不就完事了吗?

是的,梦境总是那么美好,咱们不妨试试。

    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class MyParameterAttribute : Attribute, IParameterModelConvention
{
private readonly string _name; public MyParameterAttribute(string name)
{
_name = name;
} public void Apply(ParameterModel parameter)
{
parameter.ParameterName = _name;
}
}

接着,套在控制器的操作方法上。

public class TestController : Controller
{
[HttpGet("test/get")]
public int GetNumber([MyParameter("num")]int xx) => xx * 5;
}

试试看,访问 /test/get?num=5。结果……

WTF,这是咋回事呢?不知道伙伴们有没有看过老周曾写过模型绑定的水文。其实这里我们不需要对模型绑定有多深的了解,但我们得知道,对于操作方法的参数来说,是存在模型绑定这一过程的。这就导致不能修改一下参数名就完事了,ModelBinder 认的是参数的数据类型,而不是 ApplicationModel 中的信息。这里头牵涉的东西太多了,你无法任性地扩展一两个接口就能完事的。但也不是没有办法,不用写扩展,有个现成的特性类也能给参数设置别名。

   [HttpGet("test/get")]
public int GetNumber([ModelBinder(Name = "num")]int xx) => xx * 5;

使用 ModelBinder特性,然后改一下 Name 属性就好了。咱们再试试。

怎么样,有效果吧。

可你又说了,我要是坚持要通过约定接口来扩展,那有法子乎?有,原理一样,改 ModelBinder 的名字。

    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class MyParameterAttribute : Attribute, IParameterModelConvention
{
private readonly string _name; public MyParameterAttribute(string name)
{
_name = name;
} public void Apply(ParameterModel parameter)
{
// 注意,BindingInfo 属性可能会为null
parameter.BindingInfo ??= new BindingInfo();
// 修改模型名称
parameter.BindingInfo.BinderModelName = _name;
}
}

原理就是设置 BindingInfo 类的 BinderModelName 属性。

再试试看。

[HttpGet("test/get")]
public int GetNumber([MyParameter("num")]int xx) => xx * 5;

总算有满意的结果了。

【ASP.NET Core】MVC控制器的各种自定义:修改参数的名称的更多相关文章

  1. ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC控制器简介 ASP.NET Core MVC控制器操作简介 ASP.NET Core MVC控制器操作简介返回类型简介 ASP.NET C ...

  2. ASP.NET Core 入门笔记5,ASP.NET Core MVC控制器入门

    摘抄自https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc-controller-action.html 一.前言 1.本教程主要内容 A ...

  3. ASP.NET Core MVC里面Razor如何获取URL参数

    原文:ASP.NET Core MVC里面Razor如何获取URL参数 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...

  4. ASP.NET Core MVC 控制器创建与依赖注入

    本文翻译自<Controller activation and dependency injection in ASP.NET Core MVC>,由于水平有限,故无法保证翻译完全准确,欢 ...

  5. 扒一扒asp.net core mvc控制器的寻找流程

    不太会排版,大家将就看吧. asp.net core mvc和asp.net mvc中都有一个比较有意思的而又被大家容易忽略的功能,控制器可以写在非Web程序集中,比如Web程序集:"MyW ...

  6. asp.net core MVC 控制器,接收参数,数据绑定

    1.参数 HttpRequest HttpRequest 是用户请求对象 QueryString Form Cookie Session Header 实例: public IActionResult ...

  7. Asp.Net Core MVC控制器和视图之间传值

    一.Core MVC中控制器和视图之间传值方式和Asp.Net中非常类似 1.弱类型数据:ViewData,ViewBag 2.强类型数据:@model 二.代码 实例  1.ViewData pub ...

  8. ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门

    一.前言 1.本文主要内容 ASP.NET Core MVC路由工作原理概述 ASP.NET Core MVC带路径参数的路由示例 ASP.NET Core MVC固定前/后缀的路由示例 ASP.NE ...

  9. Pro ASP.NET Core MVC 第6版 第一章

    目录 第一章 ASP.NET Core MVC 的前世今生 ASP.NET Core MVC 是一个微软公司开发的Web应用程序开发框架,它结合了MVC架构的高效性和简洁性,敏捷开发的思想和技术和.N ...

  10. ASP.NET Core MVC 之视图(Views)

    ASP.NET Core MVC 控制器可以使用视图返回格式化的结果. 1.什么是视图 在 MVC 中,视图封装了用户与应用交互呈现细节.视图是具有生成要发送到客户端内容的,包含嵌入代码的HTML模板 ...

随机推荐

  1. 【设计模式】Java设计模式 - 反射机制

    [设计模式]Java设计模式 - 反射机制 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 反射 ...

  2. 3款知名RTMP推流模块比较:OBS VS SmartPublisher VS Flash Media Live Encoder

    OBS 功能强大,几乎所有你想要的场景它都有,用起来很顺手.可以将桌面.摄像头.程序窗口通过rtmp推送到流媒体服务器上. 当然如果你是开发者,想基于OBS做二次开发,实现二次产品化的化,难度比较大, ...

  3. PHP之旅---出发(php+apache+MySQL)

    @ 目录 前言 准备 php安装 Apache安装 MySQL安装 Navicat安装(附) Apache+php整合 验证Apache+php 前言 本文详细介绍php+apache+MySQL在w ...

  4. Logstash:解析 JSON 文件并导入到 Elasticsearch 中

    转载自:https://elasticstack.blog.csdn.net/article/details/114383426 在今天的文章中,我们将详述如何使用 Logstash 来解析 JSON ...

  5. 苹果手机安装郑好办手机app后给绿城通公交卡充值的步骤

    1.苹果手机,需要带有NFC功能 苹果XS手机该功能默认是开启的,不用额外的其他操作 苹果11该功能需要设置开启才行.步骤:设置--通用--NFC,然后开启 2,公交卡 如下这种的公交卡可以充值: 如 ...

  6. Fluentd部署:系统配置

    Fluentd的全局配置项,诸如开启RPC.使用多worker模式等.可在配置文件中通过<system>进行配置,或通过命令行进行配置. 参数 workers:指定worker进程数,默认 ...

  7. 使用docker-compose部署SonarQube

    sonarqube 安装 1.系统配置,避免启动问题 # 系统配置,避免启动问题 echo "vm.max_map_count=262144" >> /etc/sysc ...

  8. vue3基础

    什么是CDN? 内容分发网络--通过相互链接的网络系统,利用最靠近用户的服务器,更快更可靠的发送给用户. vue的cdn引入 method中的函数为什么不能用this? this的主要使用是来获取da ...

  9. 彻底掌握Makeifle(三)

    彻底掌握Makeifle(三) 前言 在前面的文章彻底掌握Makefile(一)和彻底掌握Makefile(二)当中,我们简要的介绍了一些常见的makefile使用方法,在本篇文章当中我们将继续介绍一 ...

  10. flutter系列之:查询设备信息的利器:MediaQuery

    目录 简介 MediaQuery详解 MediaQuery的属性 MediaQuery的构造函数 MediaQuery的使用 总结 简介 移动的开发中,大家可能最头疼的就是不同设备的规格了,现在设备这 ...