从控制器的类

时间:2016-08-05 05:39:15

标签: c# asp.net-mvc

当我所知道的是"HelloWorld"课时,是否有一种有效的方法来获取控件名HelloWorldController

可能是这样的:

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

但我想这个功能已在框架中提供。

5 个答案:

答案 0 :(得分:2)

在构造函数中(在C#中),您可以获取类名:

this.GetType().Name

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

RouteData.Values["controller"]

答案 1 :(得分:2)

DefaultHttpControllerSelector有一个受保护的方法,可以根据默认的<controller name>Controller类命名约定来获取控制器的名称。

继续在实用程序类中继承DefaultHttpControllerSelector可以做到这一点。我不再需要这个了,所以我将实现留给你的想象力。

答案 2 :(得分:1)

请尝试以下代码。

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

enter image description here

答案 3 :(得分:1)

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

如果你决定走这条路,你必须自己编写这个功能。把它放在一般的实用类中似乎是最好的选择。另一种可能的方法是创建一个扩展Controller并实现此功能的类,然后让控制器直接扩展它而不是Controller。

答案 4 :(得分:0)

为什么不直接使用:

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

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

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