ASP.NET 核心控制器上下文与 UrlHelper 中的动作上下文



我正在尝试在我的 Asp.net 核心 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);
});

但控制器也有派生自ActionContextControllerContext(https://learn.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 的正确方法。这会导致问题吗?如果您能指出我围绕此的一些文档的方向,或者解释该方法是好/坏的原因,那将非常有帮助。

你所拥有的可以工作。

但是,它确实将控制器与实现问题紧密耦合。

如果您需要帮助程序,您可以遵循与启动时配置的格式类似的格式,方法是将IUrlHelperFactory注入控制器并使用控制器的ControllerContext获取帮助程序,正如您已经发现的那样,该ActionContext

public class MyController : Controller {
private readonly IUrlHelperFactory factory;
//...other dependencies
public MyController(IUrlHelperFactory factory) {
this.factory = factory;
//...other dependencies
}
public IActionResult GetAll() {
var urlHelper = factory.GetUrlHelper(ControllerContext);
var nextLink = urlHelper.Link("GetPosts", new { page = 1, pageSize = 3 });
return Ok(new {
NextPageLink = nextLink,
Results = _context.Posts,
test = ControllerContext.RouteData.Values
});
}
//...other actions
}

最新更新