从控制器的类中获取 MVC 控制器名称

Posted

技术标签:

【中文标题】从控制器的类中获取 MVC 控制器名称【英文标题】:Get MVC controller name from controller's class 【发布时间】:2016-08-05 05:39:14 【问题描述】:

当我只知道类 HelloWorldController 时,有没有一种有效的方法来获取控件名称 "HelloWorld"

可能是这样的:

var str = HelloWorldController.NetExtensionMethodWhichRetursActionName(); // str = "HelloWorld" 编辑:不能存在,因为(当前)扩展方法只存在于实例中

var str = NetUtilClass.MethodWhichRetursActionNameFromControllerclass(typeof(HelloWorldController)); // str = "HelloWorld"

或者别的什么...

我知道我可以写这样的东西:

string GetName<T>() where T : Controller  var s = typeof(T).Name; return s.Delete(s.Length - "Controller".Length; 

但我猜这个功能已经在框架中可用了。

【问题讨论】:

反思?什么?您需要提供更多信息。 你想做什么? 你想列出类中的所有动作 您希望它们在哪里显示? 你的问题不清楚,控制器在哪里弄,你想怎么用,说清楚 【参考方案1】:

DefaultHttpControllerSelector 有一个受保护的方法,可以根据默认的&lt;controller name&gt;Controllerclass 命名约定来获取控制器的名称。

只要在实用程序类中继承DefaultHttpControllerSelector 就可以了。我不再需要这个了,所以我将实现留给你想象。

【讨论】:

【参考方案2】:

请尝试以下代码。

var V=RouteData.Values.First().Value.ToString();

【讨论】:

【参考方案3】:

没有内置函数会自动为您执行此操作,因为将“Controller”放在名称末尾只是一种常见做法。不能保证控制器实际上会以这种方式命名,因此检查类型是否为 Controller 不足以确保该函数会执行您想要的操作。出于这个原因,我会仔细考虑你的设计决定走这条路。如果有人决定在某个时候重命名您的控制器怎么办?如果控制器名称基于更改,但控制器名称没有变化怎么办?

如果你决定走这条路,你将不得不自己编写函数。将它放在通用实用程序类中似乎是最好的选择。另一种可能的方法是创建一个扩展 Controller 并实现此功能的类,然后让您的 Controller 扩展它而不是直接扩展 Controller。

【讨论】:

【参考方案4】:

在构造函数中(在 C# 中)你可以得到类名:

this.GetType().Name

在一个动作中,您可以从 RouteData 获取 C# 中的控制器名称:

RouteData.Values["controller"]

【讨论】:

类型以Controller结尾。我需要控制器的名称,但不需要。控制器的名称是路由中的controller【参考方案5】:

你为什么不直接使用:

string controllerName = nameof(HomeController).Replace("Controller", "");
//controllerName = "Home"

更新 对于那些痴迷于性能的人来说,以下代码的性能大约提高了 3 倍:

string controllerName = nameof(HomeController);
controllerName = controllerName.Remove(controllerName.Length - 10);//10 is length of "Controller"

【讨论】:

因为正如其他人指出的那样,不能保证类名包含控制器名。我可以定义一个类名 Foo 并给它一个控制器名称“Bar”。 @JamesQMurphy 嗯,这不符合标准。如果你知道你使用什么模式来命名你的控制器,那么你可以修改代码以正常工作。

以上是关于从控制器的类中获取 MVC 控制器名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在静态方法或控制器外的类中获取applicationDbContext的dbContext

如何在 ASP.NET MVC 中获取当前用户

MVC中获取来自控制器名称与动作的方法

带有 @PathVariable 的 Spring MVC 带注释的控制器接口

如何将我自己的类注入到 ASP.NET MVC Core 的控制器中?

MVC如何从视图调用控制器中的动作以返回值