UrlHelper.Action без жестко запрограммированных строк для controllerName и controllerAction - PullRequest
1 голос
/ 04 июля 2019

Я хотел бы создать удобный вспомогательный метод, который поможет создать URL из данного типа контроллера и действия / метода на этом контроллере. В ASP.NET Core MVC есть метод IUrlHelper.Action(string actionName, string controllerName), который делает то же самое.

Но вместо этого: UrlHelper.Action("MyAction", "MyController")

Я хотел бы использовать: UrlHelper.Action<MyController>(c => c.MyAction)

Теперь мне удалось частично решить эту проблему, что позволяет мне сделать что-то вроде этого: UrlHelper.Action<MyController>(c => c.MyAction()) (обратите внимание на круглые скобки после имени действия), используя следующий код:

    public static string ActionFor<TController>(this IUrlHelper source, Expression<Func<TController, object>> memberExpression) where TController : Controller
    {
        if (!(memberExpression.Body is MemberExpression body)) throw new ArgumentException($"Expression must be a {typeof(MemberExpression).Name}.", nameof(memberExpression));

        return source.Action(body.Member.Name, typeof(TController).RemoveControllerSufix());
    }

но я не знаю, как сказать компилятору, что я бы хотел, чтобы этот параметр memberExpression принимал группу методов (или аналогичную), чтобы я мог написать имя действия без скобок.

P.S. Мы также можем сделать что-то вроде: UrlHelper.Action<MyController>(nameof(MyController.MyAction)), что также позволяет избежать жесткого кодирования строк, но при этом дублирует тип контроллера, что также было бы неплохо избежать.

Мне кажется, я видел сообщение Джона Скита где-то на SO, связанное с чем-то похожим, но я просто сейчас не могу его найти ...

...