从控制器的类中获取 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
有一个受保护的方法,可以根据默认的<controller name>Controller
class 命名约定来获取控制器的名称。
只要在实用程序类中继承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
带有 @PathVariable 的 Spring MVC 带注释的控制器接口