UrlHelper中的ASP.NET Core ControllerContext与ActionContext

时间:2018-09-17 22:53:31

标签: asp.net asp.net-mvc asp.net-web-api

我正在尝试在Asp.net core 2 API中实现分页。要创建分页链接,我正在使用UrlHelper。 UrlHelper的构造函数需要在其中运行操作的上下文。

我看到的示例在启动时一直使用以下配置,然后将IUrlHelper注入需要的控制器中。

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IUrlHelper>(x => {
    var actionContext = x.GetRequiredService<IActionContextAccessor>().ActionContext;
    var factory = x.GetRequiredService<IUrlHelperFactory>();
    return factory.GetUrlHelper(actionContext);
});

但是控制器也有ControllerContext,它是从ActionContexthttps://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controllercontext?view=aspnetcore-2.1)派生的。

我能够执行以下操作:

 public Object GetAll() //ignore object return, for test purposes
    {
        var urlHelper = new UrlHelper(ControllerContext);
        var nextLink = urlHelper.Link("GetPosts", new { page = 1, pageSize = 3 });
        //return _context.Posts;
        return new
        {
            NextPageLink = nextLink,
            Results = _context.Posts,
            test = ControllerContext.RouteData.Values
        };
    }

上面的代码能够正确创建链接。我对框架的细微差别不甚了解,因此我想知道上面是否是初始化UrlHelper的正确方法。这会导致问题吗?如果您可以向我介绍一些与此相关的文档,或者解释该方法好/不好的背后原因,那将非常有帮助。

1 个答案:

答案 0 :(得分:1)

您所拥有的可以工作。

但是,它确实将控制器与实现问题紧密联系在一起。

如果需要帮助程序,可以通过将$t1注入控制器并使用控制器的IUrlHelperFactory获取帮助程序,以遵循与启动时配置的格式类似的格式。已经发现,源自ControllerContext

ActionContext