首页 > 编程语言 >【ASP.NET Core】MVC控制器的各种自定义:修改参数的名称

【ASP.NET Core】MVC控制器的各种自定义:修改参数的名称

时间:2022-11-19 10:57:39浏览次数:45  
标签:Core ASP string 自定义 int class xx public name

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

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

    [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;

 

总算有满意的结果了。

 

标签:Core,ASP,string,自定义,int,class,xx,public,name
From: https://www.cnblogs.com/tcjiaan/p/16905627.html

相关文章

  • ASP.NET Core教程-Middleware(中间件)
    更新记录转载请注明出处:2022年11月17日发布。2022年11月16日从笔记迁移到博客。Middleware(中间件)中间件介绍中间件可以处理请求(Request)和响应(Response)。中间......
  • bootstrap静态后台模板-头部导航条-自定义颜色
    <!DOCTYPEhtml><htmllang="en"backgound=""><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname......
  • kubernetes_CoreDNS全解析
    一、前言kubernetesCoreDNS是kube-system命令空间里面的一个Pod,用于域名解析。kubernetes自带三个命名空间(用kubeadm安装的Kubernetes集群):defaultkube-public......
  • 第五十一章 开发自定义标签 - 使用%CSP.Rule方法
    第五十一章开发自定义标签-使用%CSP.Rule方法类中的%CSP.Rule包含几个可在<csr>规则定义中使用的实例方法。这些方法可以是两种类型之一:只读并返回元素值的方法......
  • ZABBIX开发自定义进程关键字监控
    脚本内容:#!/bin/sh####################################################Usedtomonitorthenumberofprocesskeywords#scriptbyshell#writedbyDeliver#20......
  • 适易工作流平台 C#工作流平台 ASP.NET工作流平台
     工作流实现思路:1.     参考微软WWF工作流2.     充分利用了原配置实现增删改查的框架3.     完全采用数据库记录,利用WEB实现工作流转和通知,利用WEB实现......
  • 定制ASP.NET Core的身份认证
    定制ASP.NETCore的身份认证 大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。在本章,我们将学习如......
  • vue自定义input组件(一)
    其实,开发一个自定义input,难度上还好,但是比较繁琐。因为input有很多状态。首先明确一下需求:需求是我用这个自定义输入框当我配置他的输入类型是什么(比如邮箱)之后我......
  • 自定义IE表达式使用.tld文件减少jsp文件中的java代码时出现的错误(可运行)cvc-id.3
    tld类型的文件产生错误如下:但是不影响运行。只需要如下:将j--->J就行。原因知晓,若有大佬知晓,欢迎留言。本人看到后,必将改正 ......
  • java自定义异常
    package异常和断言;publicclass自定义异常{publicstaticvoidmain(String[]args){try{//抛出自定义异常,fd为异常信息thrownewd("fd");}//捕捉自定义异常catch(de......