我正在尝试在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
,它是从ActionContext
(https://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的正确方法。这会导致问题吗?如果您可以向我介绍一些与此相关的文档,或者解释该方法好/不好的背后原因,那将非常有帮助。
答案 0 :(得分:1)
您所拥有的可以工作。
但是,它确实将控制器与实现问题紧密联系在一起。
如果需要帮助程序,可以通过将$t1
注入控制器并使用控制器的IUrlHelperFactory
获取帮助程序,以遵循与启动时配置的格式类似的格式。已经发现,源自ControllerContext
ActionContext