不包含controllerName和controllerAction的硬编码字符串的UrlHelper.Action

时间:2019-07-04 16:28:07

标签: c# asp.net-core lambda .net-core asp.net-core-mvc

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

0 个答案:

没有答案