Я хотел бы создать удобный вспомогательный метод, который поможет создать 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, связанное с чем-то похожим, но я просто сейчас не могу его найти ...