在RC1中,IUrlHelper
可以被注入到服务中(在启动类中使用services.AddMvc()
)
这在RC2中不再起作用。有人知道如何在RC2中做到这一点吗?因为仅仅是新建一个UrlHelper
就需要一个ActionContext
对象。不知道如何在控制器之外获得它。
发布于 2016-05-19 19:49:30
.NET核心3+和.NET 5更新(2020及更高版本)
使用@Dmitry Pavlov的answer on this thread中详细介绍的LinkGenerator
。它可以作为web框架的一部分注入,并与控制器中已经可用的HttpContext
一起工作,或者通过注入IHttpContextAccessor
在其他服务中访问。
对于ASP.NET核心RC2,有一个issue for this on the github repo。接受一个IUrlHelperFactory
,而不是注入IUrlHelper
。听起来您还需要注入IActionContextAccessor
,因为Controller
不再具有公共属性ActionContext
。
注册依赖项:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
然后依靠它:
public SomeService(IUrlHelperFactory urlHelperFactory,
IActionContextAccessor actionContextAccessor)
{
var urlHelper =
urlHelperFactory.GetUrlHelper(actionContextAccessor.ActionContext);
}
然后按您认为合适的方式使用它。
发布于 2020-01-18 00:35:47
对于ASP.NET Core3.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();
}
发布于 2018-03-02 14:27:54
适用于Net Core 2.0
将此添加到service.AddMvc()
之后
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IUrlHelper>(factory =>
{
var actionContext = factory.GetService<IActionContextAccessor>()
.ActionContext;
return new UrlHelper(actionContext);
});
https://stackoverflow.com/questions/37322076
复制相似问题