如何从另一个动作中获取MVC动作的动作名称?

时间:2015-08-13 19:16:40

标签: asp.net-mvc asp.net-mvc-5.2

我正在使用ASP.NET MVC 5.2.3,我想知道我在同一控制器中的另一个动作中给控制器中的动作提供的自定义名称。

除了在变量中存储操作的短名称或通过在控制器类型中的所有操作中查找ActionName属性来使用反射来获取它之外,是否有更好的方法来获取此名称?

请考虑这个例子。

class FooController : Controller
{
  [ActionName("shortName")]
  public ActionResult LongActionNameIDoNotWantToExposeInTheUri()
  {
  }

  public ActionResult AnotherAction()
  {
    // This make the Uri as 
    // /Foo/LongActionNameIDoNotWantToExposeInTheUri
    // Instead, I want it to be /Foo/shortName
    // I can, of course, hardcode or store the short name
    // in a variable and get it but is there a better way?
    var url = Url.Action("LongActionNameIDoNotWantToExposeInTheUri", "Foo");
  }
}

1 个答案:

答案 0 :(得分:0)

试试这个

Type controllerType = typeof(FooController);
string actionMethodName = "LongActionNameIDoNotWantToExposeInTheUri";
MethodInfo methodInfo = controllerType.GetMethod(actionMethodName);

var attributes = methodInfo.GetCustomAttributes(typeof(ActionNameAttribute), false);
string actionName = string.empty;
if (attributes.Length > 0)
{
    actionName = ((ActionNameAttribute)attributes[0]).Name;
}

或者如果您想将其与方法一起使用

public string GetActionName(Controller controller, string actionMethodName)
{
  Type controllerType = controller.GetType();
  MethodInfo methodInfo = controllerType.GetMethod(actionMethodName);

  var attributes = methodInfo.GetCustomAttributes(typeof(ActionNameAttribute), false);
  if (attributes.Length > 0)
  {
      return ((ActionNameAttribute)attributes[0]).Name;
  }
  else
  {
    throw new IndexOutOfRangeException("This controller doesnt have Action Name");
  }
}

// if you are in the Controller class
string actionName = GetActionName(this, "LongActionNameIDoNotWantToExposeInTheUri");