Метод расширения для получения имени контроллера без суффикса - PullRequest
0 голосов
/ 05 февраля 2019

Я не хочу повторять следующее

nameof(HomeController).Replace(nameof(Controller), string.Empty)

каждый раз, когда мне нужно указать имя контроллера без суффикса «Контроллер».

Есть ли какой-нибудь элегантный способ упростить?Я попытался создать метод расширения следующим образом, но я не знаю, как получить экземпляр рассматриваемого контроллера из представления cshtml.

using Microsoft.AspNetCore.Mvc;

namespace WebApplication1
{
    public static class Utilities
    {
        public static string BareName(this Controller controller)
        {
            return nameof(controller.GetType).Replace(nameof(Controller), string.Empty);
        }
    }
}

Я хочу вызвать следующее, например, впросмотр страницы.

@Html.ActionLink("something", nameof(HomeController.someaction), nameof(HomeController).Replace(nameof(Controller), string.Empty))

Ответы [ 4 ]

0 голосов
/ 21 апреля 2019
[HttpGet]
public IActionResult Get([FromRoute]string controller)
{ 
    //controller will be Controller name without suffix "Controller".
}
0 голосов
/ 05 февраля 2019

Если вы в представлении, просто используйте 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>
0 голосов
/ 05 февраля 2019

Вы можете создать отдельный метод расширения для ActionContext, который разрешает имя контроллера из ActionDescriptor.

public static string GetControllerName(this ActionContext actionContext)
{
    return (actionContext.ActionDescriptor as ControllerActionDescriptor)?.ControllerName;
}

Вам не нужно обрезать часть "Controller" из строки вэтот случай.Назовите это, по вашему мнению, так:

var controllerName = ViewContext.GetControllerName();
0 голосов
/ 05 февраля 2019

Предполагая, что вам нужно имя контроллера, который в данный момент не обрабатывает запрос, вы хотите что-то вроде этого:

public static string BareName<T>() where T: Controller
{
    return typeof(T).Name.Replace(nameof(Controller), string.Empty);
}

Затем вы можете использовать его следующим образом:

@Html.ActionLink("something", nameof(HomeController.someaction), Utilities.BareName<HomeController>())

Я до сих пор не уверен, почему Microsoft не включила это в состав основного пакета ASP.NET Core ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...