在 ASP.NET 核心中注入 IUrlHelper
Injection of IUrlHelper in ASP.NET Core
在 RC1 中,IUrlHelper
可以在服务中注入(services.AddMvc()
在启动时 class)
这在 RC2 中不再有效。有谁知道如何在 RC2 中做到这一点,因为只是更新 UrlHelper
需要一个 ActionContext
对象。不知道如何在控制器之外获取它。
.NET Core 3+ 和 .NET 5 更新(2020 及更高版本)
按照@Dmitry Pavlov 的 中的详细说明使用LinkGenerator
。它可以作为 Web 框架的一部分进行注入,并与控制器中已有的 HttpContext
一起使用,或者通过注入 IHttpContextAccessor
.
在其他服务中访问。
ASP.NET Core RC2 有一个 issue for this on the github repo。不要注入 IUrlHelper
,而是注入 IUrlHelperFactory
。听起来您还需要注入 IActionContextAccessor
,因为 Controller
不再具有 public 属性 ActionContext
.
注册依赖:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
那就靠它了:
public SomeService(IUrlHelperFactory urlHelperFactory,
IActionContextAccessor actionContextAccessor)
{
var urlHelper =
urlHelperFactory.GetUrlHelper(actionContextAccessor.ActionContext);
}
然后根据需要使用它。
ASP.NET核心2.0
安装
PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper
使用
public void ConfigureServices(IServiceCollection services)
{
...
services.AddUrlHelper();
...
}
免责声明:此包的作者
对于Net Core 2.0
在service.AddMvc()
之后添加这个
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IUrlHelper>(factory =>
{
var actionContext = factory.GetService<IActionContextAccessor>()
.ActionContext;
return new UrlHelper(actionContext);
});
对于 .Net Core 2.0
services.AddMvc();
services.AddScoped<IUrlHelper>(x =>
{
var actionContext = x.GetRequiredService<IActionContextAccessor>().ActionContext;
var factory = x.GetRequiredService<IUrlHelperFactory>();
return factory.GetUrlHelper(actionContext);
});
对于 ASP.Net Core 2.0,您不得注入 IUrlHelper。它可以作为控制器的 属性 使用。 ControllerBase.Url 是一个 IUrlHelper 实例。
对于 ASP.NET Core 3.x 应用程序只需将 IHttpContextAccessor
和 LinkGenerator
注入您的控制器或服务。它们应该已经在 DI
.
中可用
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
namespace Coding-Machine.NET
{
public class MyService
{
private readonly IHttpContextAccessor _accessor;
private readonly LinkGenerator _generator;
public MyService(IHttpContextAccessor accessor, LinkGenerator generator)
{
_accessor = accessor;
_generator = generator;
}
private string GenerateConfirmEmailLink()
{
var callbackLink = _generator.GetUriByPage(_accessor.HttpContext,
page: "/Account/ConfirmEmail",
handler: null,
values: new {area = "Identity", userId = 123, code = "ASDF1234"});
return callbackLink;
}
}
}
如果您的应用无法解析 IHttpContextAccessor
,只需将其添加到 DI
:
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
}
在 RC1 中,IUrlHelper
可以在服务中注入(services.AddMvc()
在启动时 class)
这在 RC2 中不再有效。有谁知道如何在 RC2 中做到这一点,因为只是更新 UrlHelper
需要一个 ActionContext
对象。不知道如何在控制器之外获取它。
.NET Core 3+ 和 .NET 5 更新(2020 及更高版本)
按照@Dmitry Pavlov 的LinkGenerator
。它可以作为 Web 框架的一部分进行注入,并与控制器中已有的 HttpContext
一起使用,或者通过注入 IHttpContextAccessor
.
ASP.NET Core RC2 有一个 issue for this on the github repo。不要注入 IUrlHelper
,而是注入 IUrlHelperFactory
。听起来您还需要注入 IActionContextAccessor
,因为 Controller
不再具有 public 属性 ActionContext
.
注册依赖:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
那就靠它了:
public SomeService(IUrlHelperFactory urlHelperFactory,
IActionContextAccessor actionContextAccessor)
{
var urlHelper =
urlHelperFactory.GetUrlHelper(actionContextAccessor.ActionContext);
}
然后根据需要使用它。
ASP.NET核心2.0
安装
PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper
使用
public void ConfigureServices(IServiceCollection services)
{
...
services.AddUrlHelper();
...
}
免责声明:此包的作者
对于Net Core 2.0
在service.AddMvc()
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IUrlHelper>(factory =>
{
var actionContext = factory.GetService<IActionContextAccessor>()
.ActionContext;
return new UrlHelper(actionContext);
});
对于 .Net Core 2.0
services.AddMvc();
services.AddScoped<IUrlHelper>(x =>
{
var actionContext = x.GetRequiredService<IActionContextAccessor>().ActionContext;
var factory = x.GetRequiredService<IUrlHelperFactory>();
return factory.GetUrlHelper(actionContext);
});
对于 ASP.Net Core 2.0,您不得注入 IUrlHelper。它可以作为控制器的 属性 使用。 ControllerBase.Url 是一个 IUrlHelper 实例。
对于 ASP.NET Core 3.x 应用程序只需将 IHttpContextAccessor
和 LinkGenerator
注入您的控制器或服务。它们应该已经在 DI
.
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
namespace Coding-Machine.NET
{
public class MyService
{
private readonly IHttpContextAccessor _accessor;
private readonly LinkGenerator _generator;
public MyService(IHttpContextAccessor accessor, LinkGenerator generator)
{
_accessor = accessor;
_generator = generator;
}
private string GenerateConfirmEmailLink()
{
var callbackLink = _generator.GetUriByPage(_accessor.HttpContext,
page: "/Account/ConfirmEmail",
handler: null,
values: new {area = "Identity", userId = 123, code = "ASDF1234"});
return callbackLink;
}
}
}
如果您的应用无法解析 IHttpContextAccessor
,只需将其添加到 DI
:
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
}