Получить имя контроллера 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; }

но я предполагаю, что эта функциональность уже доступна в рамках.

c#,asp.net-mvc,

1

Ответов: 4


2

В конструкторе (в C #) вы можете получить имя класса:

this.GetType().Name

В действии вы можете получить имя контроллера в C # из RouteData:

RouteData.Values["controller"]

2 принят

DefaultHttpControllerSelectorимеет защищенный метод для получения базы имени контроллера в стандартном <controller name>Controllerсоглашении об именах классов по умолчанию .

Дойти до унаследования DefaultHttpControllerSelectorв классе полезности можно было бы сделать трюк. Мне это больше не нужно, поэтому я оставляю реализацию для вашего воображения.


1

Пожалуйста, попробуйте ввести код ниже.

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

введите описание изображения здесь


1

Нет встроенной функции, которая автоматически сделает это для вас, потому что установка «Контроллер» в конце имени является обычной практикой. Не гарантируется, что контроллер будет называться таким образом, поэтому проверка того, что тип является контроллером, недостаточна, чтобы гарантировать, что функция будет делать то, что вы хотите. По этой причине я бы дважды подумал, что ваше дизайнерское решение пойдет по этому пути. Что, если кто-то решит переименовать ваш контроллер в какой-то момент? Что делать, если какое-либо имя контроллера основано на изменениях, но имя контроллера отсутствует?

Если вы решите пойти по этому маршруту, вам придется написать эту функцию самостоятельно. Включение его в общий класс полезности представляется лучшим выбором. Другой возможный маршрут - создать класс, который расширяет Controller и реализует эту функциональность, а затем ваши контроллеры расширяют это, а не Controller напрямую.

C #, asp.net-MVC,
Похожие вопросы