Если вы в представлении, просто используйте ViewContext.RouteData.Values["controller"]
.
ОБНОВЛЕНИЕ (на основе отредактированного вопроса)
Так что, да, это не былоЯсно до того, чего вы на самом деле пытались достичь.По сути, вы хотите иметь возможность указывать параметры контроллера / действия таких методов, как Html.Action
, без использования жестко закодированных строк.Что касается методов расширения, ваша лучшая ставка - это расширение IHtmlHelper
, например:
public static class IHtmlHelperExtensions
{
public static string GetControllerName<TController>(this IHtmlHelper helper)
where TController : Controller
{
return typeof(TController).GetName().Replace("Controller", "");
}
}
, которое вы затем можете использовать следующим образом:
Html.GetControllerName<HomeController>()
Однако это все равно кажется неуклюжиммне.Честно говоря, если вы хотите избежать жесткого кодирования, я бы порекомендовал назвать ваши маршруты и использовать статический класс для размещения имен:
public static class RouteNames
{
public const string Home = "Home";
}
Тогда:
public class HomeController : Controller
{
[HttpGet("", Name = RouteNames.Home)]
public IActionResult Index() => View();
}
И наконец:
@Html.RouteLink(RouteNames.Home, RouteNames.Home)
Или через помощника по тегам:
<a asp-route="@RouteNames.Home">@RouteNames.Home</a>