我想创建一个方便的帮助程序方法,该方法可以根据给定的控制器类型以及该控制器上的操作/方法来构造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上某处看到了Jon Skeet的帖子,该帖子与类似内容有关,但我现在找不到了...