首页 > 编程语言 >【ASP.NET Core】MVC控制器的各种自定义:应用程序约定的接口与模型

【ASP.NET Core】MVC控制器的各种自定义:应用程序约定的接口与模型

时间:2022-11-13 18:00:10浏览次数:42  
标签:Core 控制器 ASP name 自定义 应用程序 接口 ControllerNameAttribute

从本篇起,老周会连发N篇水文,总结一下在 MVC 项目中控制器的各种自定义配置。

本文内容相对轻松,重点讨论一下 MVC 项目中的各种约定接口。毕竟你要对控制器做各种自定义时,多数情况会涉及到约定接口。约定接口的结构都差不多,均包含一个 Apply 方法,实现类需要通过这个方法修改关联的模型设置。

这些约定接口是按层次来定义的,下面咱们来扒一下。

a、IApplicationModelConvention:此接口可控制的面最广,属于应用程序层面。它对应的模型类是 ApplicationModel。该类有个重要属性—— Controllers,通过它你能获取到当前应用程序已发现和识别的所有控制器信息。每个控制器也有自己的模型类:ControllerModel。

b、IControllerModelConvention:此接口只应用于控制器层面,而不是整个应用程序。对应的模型类就是上面提到过的 ControllerModel。ControllerType属性可以获取控制器类的 Type 信息,而 ControllerName 属性最有用,因为可以改变默认的控制器命名。Actions 属性返回此控制器中所有操作方法(Action)列表。

c、IActionModelConvention:这个接口只应用于操作方法。对应的模型类是 ActionModel。通过 ActionName 属性可以修改操作方法的名称。当然,操作方法的名称可以用 ActionNameAttribute 特性类来定义。

d、IParameterModelConvention:此接口只能自定义操作方法的参数,对应的模型类是 ParameterModel。

e、IPageApplicationModelConvention、IPageHandlerModelConvention、IPageRouteModelConvention:这些接口是用在 Razor Pages 上的,也可以实现一些自定义行为。

按照需求实现对应的接口。对于应用程序层面的设置,将实现相关约定接口的类实例添加到 MvcOptions.Conventions 集合中。如果实现了 IControllerModelConvention 接口的类实例添加到 Conventions 集合中,那么它会被应用到所有控制器上。如果只想用到特定的控制器上,应将实现类定义为特性类,然后应用程序目标控制器上。

好了,理论的东西老周就不长篇大吹了,毕竟也不是老周的特长。只要你了解以上各接口和相关模型类,基本上就能运用了。

下面咱们做个很实在的演示:写一个特性类(ControllerNameAttribute),用来给控制器设置名称。既然是针对控制器的,约定接口应选择 IControllerModelConvention。实现代码如下:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class ControllerNameAttribute : Attribute, IControllerModelConvention
{
    // 私有字段
    private readonly string _name;

    // 构造函数
    public ControllerNameAttribute(string name)
    {
        // 自定义的控制器名称就是这样传递的
        _name = name;
    }

    // 这是实现接口的方法
    public void Apply(ControllerModel controller)
    {
        // 修改控制器名称
        controller.ControllerName = _name;
    }
}

这个类的逻辑很䜭智,通过构造函数的参数来传递自定义的控制器名称,然后存在 _name 私有字段中。在Apply方法中,把 _name 字段赋值给 ControllerName属性,就完成控制器名称的修改了。

这个特性类用于控制器,它是一个类,所以 AttributeTargets 选用 Class。咱们创建一个新控制器,然后用 ControllerNameAttribute 来设置控制器的名称。

    [ControllerName("XinWen")]
    public class NewsController : Controller
    {
        [ActionName("catelogs")]
        public IActionResult GetCates()
        {
            return Ok(new string[]
            {
                "头条新闻",
                "体育新闻",
                "内娱丑闻",
                "炒股趣闻",
                "生活百事",
                "名场面集锦",
                "都市传说",
                "人品观察报"
            });
        }
    }

默认的时候,控制器名称与类名相同(有 Controller 后缀的会去掉),即 News。咱们应用刚定义的特性类 ControllerNameAttribute 将控制器命名为 XinWen。操作方法 GetCates 也被重命为 catelogs。

ActionNameAttribute 是 .NET 内置已有的类型,我们可以直接用。ControllerNameAttribute 非内置,所以咱们要自己来实现。

 

下面代码初始化应用程序。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();

app.MapControllerRoute("app", "{controller}/{action}");

app.Run();

 

程序运行后,访问 /xinwen/catelogs,就能看到结果了。

 

标签:Core,控制器,ASP,name,自定义,应用程序,接口,ControllerNameAttribute
From: https://www.cnblogs.com/tcjiaan/p/16885669.html

相关文章

  • SpringBoot 自定义注解,轻松实现 Redis 分布式锁
    1.自定义注解类@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public@interfaceReqFastLimit{//rediskeyStringkey()d......
  • 篇(10)-Asp.Net Core入门实战-上传文件,几行代码就可以搞定
    入门实战-上传文件,几行代码就可以搞定Asp.NetCore上传文件微软官方给的代码还是很简单的,但是我的开发环境在调试上传时,用谷歌浏览器,微软IE11,以及微软的Edge浏览器都可以......
  • .Net core 调用WebService
    在REST出现之前解决跨平台之间的通信问题基本都是采用基于XML的WebService进行。一、什么是WebServiceWebService是一个平台独立的,低耦合的,自包含的、基于可编程的web的......
  • 自定义字符串排序
    题目给定两个字符串order和s。order的所有单词都是唯一的,并且以前按照一些自定义的顺序排序。对s的字符进行置换,使其与排序的 order 相匹配。更具体地说,如果......
  • 791. 自定义字符串排序
    791.自定义字符串排序给定两个字符串order和s。order的所有单词都是唯一的,并且以前按照一些自定义的顺序排序。对s的字符进行置换,使其与排序的 order 相匹配......
  • 791. 自定义字符串排序 ----- 自定义sort、权值排序、计数排序
    给定两个字符串order和s。order的所有单词都是唯一的,并且以前按照一些自定义的顺序排序。对s的字符进行置换,使其与排序的 order 相匹配。更具体地说,如果在 or......
  • Java:自定义排序与sort()函数
    自定义排序与Arrays.sort()本篇题目来源:2022/11/13Leetcode每日一题:https://leetcode.cn/problems/custom-sort-string给定两个字符串order和s。order的所有单词都......
  • 使用 ASP.NET Core MVC 创建 Web API 系列文章目录
    使用ASP.NETCoreMVC创建WebAPI(一)使用ASP.NETCoreMVC创建WebAPI(二) 使用ASP.NETCoreMVC创建WebAPI(三)使用ASP.NETCoreMVC创建WebAPI(四)使用ASP.......
  • 学习ASP.NET Core Razor 编程系列文章目录
    学习ASP.NETCoreRazor编程系列一学习ASP.NETCoreRazor编程系列二——添加一个实体 学习ASP.NETCoreRazor编程系列三——创建数据表及创建项目基本页面学习ASP......
  • 学习ASP.NET MVC 编程系列文章目录
    学习ASP.NETMVC(一)——我的第一个ASP.NETMVC应用程序学习ASP.NETMVC(二)——我的第一个ASP.NETMVC控制器学习ASP.NETMVC(三)——我的第一个ASP.NETMVC视图学习......