2015-08-13 6 views
0

Я использую ASP.NET MVC 5.2.3, и я хотел бы узнать имя пользователя, которое я дал для действия в контроллере, из другого действия внутри того же контроллера.Как получить имя действия действия MVC из другого действия?

Помимо сохранения короткого имени действия в переменной самостоятельно или получения его с помощью отражения путем нахождения атрибута 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

Просто попробуйте уаг URL = Url.Action ("сокращенным", "Foo"). Надеюсь, что это сработает – malkam

+0

@malkam Вот что я подразумевал под «Я мог бы хранить его в переменной, но есть лучший способ». –

+0

Вам нужно перекомпилировать, чтобы изменить имя действия, так почему бы просто не переустановить его? Когда вы переопределите имя метода действий с атрибутом ActionName, вы все равно не можете вызвать действие по имени метода. т. е. после того, как вы получили короткое имя, вы больше не можете звонить через longname. По понятным причинам действие может иметь только одно имя. Короче говоря, ответ «нет». – rism

ответ

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"); 
+0

Спасибо. Вот что я имел в виду, делая это сам, используя отражение. Мне было интересно, есть ли какая-то помощь, предоставленная MVC. –

Смежные вопросы