【问题标题】:Get MVC controller name from controller's class从控制器的类中获取 MVC 控制器名称
【发布时间】: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; }

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

【问题讨论】:

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

标签: c# asp.net-mvc


【解决方案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 嗯,这不符合标准。如果你知道你使用什么模式来命名你的控制器,那么你可以修改代码以正常工作。
        猜你喜欢
        • 2013-08-17
        • 1970-01-01
        • 2013-11-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多