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

asp,net,core,mvc,控制器,各种,自定义,应用程序,约定,接口,模型 · 浏览次数 : 639

小编点评

**MVC 项目中的约定接口** 约定接口是 MVC 项目中用来定义控制器的自定义配置的接口。它们允许开发者通过扩展现有接口来实现特定的功能。 **主要约定接口类型** * **IControllerModelConvention:**用于控制器层自定义配置。 * **IActionModelConvention:**用于操作方法自定义配置。 * **IParameterModelConvention:**用于操作方法的参数自定义配置。 * **IPageApplicationModelConvention、IPageHandlerModelConvention、IPageRouteModelConvention:**用于 Razor Pages 中自定义页面的配置。 **示例特性类:ControllerNameAttribute** ```csharp [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; } } ``` **使用示例:** ```csharp [ControllerName("XinWen")] public class NewsController : Controller { [ActionName("catelogs")] public IActionResult GetCates() { return Ok(new string[] { "头条新闻", "体育新闻", "内娱丑闻", "炒股趣闻", "生活百事", "名场面集锦", "都市传说", "人品观察报" }); } } ``` 通过使用该特性类,我们可以为 NewsController 设置名为 XinWen 的控制器名称。

正文

从本篇起,老周会连发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,就能看到结果了。

 

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

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

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

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

在上一篇中,老周演示了通过实现约定接口的方式自定义控制器的名称。 至于说自定义操作方法的名称,就很简单了,因为有内置的特性类可以用。看看下面的例子。 [Route("[controller]/[action]")] public class StockController : Controller

【ASP.NET Core】MVC控制器的各种自定义:特性化的路由规则

MVC的路由规则配置方式比较多,咱们用得最多的是两种: A、全局规则。就是我们熟悉的”{controller}/{action}“。 app.MapControllerRoute( name: "bug", pattern: "{controller}/{action}" ); app.MapCon

【ASP.NET Core】MVC控制器的各种自定义:IActionHttpMethodProvider 接口

IActionHttpMethodProvider 接口的结构很简单,实现该接口只要实现一个属性即可——HttpMethods。该属性是一个字符串序列。 这啥意思呢?这个字符串序列代表的就是受支持的 HTTP 请求方式。比如,如果此属性返回 GET POST,那么被修饰的对象既支持 HTTP-GET

【ASP.NET Core】MVC操作方法如何绑定Stream类型的参数

咱们都知道,MVC在输入/输出中都需要模型绑定。因为HTTP请求发送的都是文本,为了使其能变成各种.NET 类型,于是在填充参数值之前需 ModelBinder 的参与,以将文本转换为 .NET 类型。 尽管 ASP.NET Core 已内置基础类型和复杂类型的各种 Binder,但有些数据还是不能

如何将 Autofac 整合进 Net6.0 Core MVC 项目中

一、前言 1、简而言之 Asp.Net Core Mvc,我也用了很长一段时间了,它现在的编程模型和方式还是特别棒的,都是组件开发,什么都可以替换,当然了,您别抬杠,有些还是不能替换的。自从我们进入了跨平台开发的时代,IOC容器也成了一个不可或缺的东西了。微软为我们提供了一个默认实现,那就是 ISe

【ASP.NET Core】动态映射MVC路由

ASP.NET Core 中的几大功能模块(Razor Pages、MVC、SignalR/Blazor、Mini-API 等等)都以终结点(End Point)的方式公开。在HTTP管道上调用时,其扩展方法基本是以 Map 开头,如 MapControllers、MapBlazorHub。 对于

Asp.net MVC 跨域设置

.Net Core 跨域

异常过滤器—MVC中异常过滤器使用

## 一、什么是异常过滤器? 异常过滤器(**Exception Filters**)是 ASP.NET Core 中用于处理全局异常的机制。它们允许你在发生异常时捕获、处理和记录异常,并提供自定义的异常处理逻辑。异常过滤器在整个应用程序范围内生效,可以用于处理各种异常情况。用于实现常见的错误处理策

做一个windos服务和api搭配,获取电脑的mac地址

创建webapi项目,只是搭配服务用,什么三层mvc都不弄了,默认的模板直接用就好。 简单分析下,采用signalr通信来传递mac地址,所以先安装个signalr的包(如果简单操作的话可以不装最新的,微软自带一个,不过好像是弃用的) using Microsoft.AspNetCore.Signa