从ActionFilter获取Controller的名称

时间:2015-04-15 19:54:43

标签: c# asp.net-mvc asp.net-mvc-5

我正在编写一个ActionFilter,并希望有一种更加类型安全的方式来使用RedirectToRouteResult。在研究这个时,我想知道是否有办法获得任何控制器的名称(作为字符串)。所以,例如,我想得到" Home"来自我的HomeController,或者#34; Admin"从我的管理员控制器。这有可能吗?

4 个答案:

答案 0 :(得分:3)

从过滤器上下文中,您可以使用以下命令获取控制器名称:

public class MyFilter : IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
        //That will give you "HomeController"
        var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

        //You can remove the "Controller" part, by replacing it with an empty string, like:
        var justTheController = controllerName.Replace("Controller", string.Empty);
    }
}

答案 1 :(得分:1)

你试过这个吗?您知道可以在实例变量上用GetType替换typeof。如果你有HomeController实例homeCtrl ....你可以做homeCtrl.GetType

  var fullName= typeof(HomeController).Name;
  var partialName = fullName.Remove(fullName.IndexOf("Controller"));

答案 2 :(得分:0)

实际上有办法获取控制器名称:

  1. filterContext.Controller会给你一个对象 可以将控制器名称推导为 filterContext.Controller.GetType().Name
  2. 您在路线值中始终拥有controller,并且可以推导为Request.RequestContext.RouteData.Values("controller").ToString()

答案 3 :(得分:0)

编写扩展方法

public static class ControllerStringExtension
{
    private const string ControllerString = "Controller";
    public static string Short(this string value)
    {
        if (value.EndsWith(ControllerString))
        {   
            //Remove 'Controller' from end of value name.             
            return value.Remove(value.Length - ControllerString.Length);
        }
        throw new ApplicationException("Should be used only for Controller names.");
    }
}

比使用:重定向到' home'控制器和'索引'动作。

 public RedirectToRouteResult Something()
    {
        return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Short());
    }