无法使用UrlHelper

Mar*_*one 15 asp.net asp.net-core-mvc

我目前正在尝试在ASP.NET 4中做一些简单而直接的事情,但是现在在ASP.NET 5中并不是这样.

以前使用UrlHelper它很简单:

var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
Run Code Online (Sandbox Code Playgroud)

但是我不能为我的生活包围我如何使用新的UrlHelper.我正在看测试用例,要么我完全愚蠢,要么我错过了一些东西,我似乎无法弄明白.这里有任何帮助来清理这个都很棒.

Dan*_*.G. 16

更新 - 发布RC2

正如@deebo所说,你不再能IUrlHelper直接从DI 获得.相反,你需要在你的类中注入一个IUrlHelperFactory和一个IActionContextAccessor并使用它们来获取IUrlHelper实例,如:

public MyClass(IUrlHelperFactory urlHelperFactory, IActionContextAccessor actionAccessor)
{
    this.urlHelperFactory = urlHelperFactory;
    this.actionAccessor = actionAccessor;
}

public void SomeMethod()
{
    var urlHelper = this.urlHelperFactory.GetUrlHelper(this.actionAccessor.ActionContext);
}
Run Code Online (Sandbox Code Playgroud)

您还需要在启动类中IUrlHelperFactory注册(默认情况下已注册):

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
Run Code Online (Sandbox Code Playgroud)

请记住,只有在获得actionContext的代码在MVC /路由中间件之后运行时,这才会起作用!(否则actionAccessor.ActionContext将为null)


我已经检索了IUrlHelper使用IServiceProviderin HttpContext.RequestServices.

通常你会有一个HttpContext属性:

  • 在控制器操作方法中,您可以:

    var urlHelper = this.Context.RequestServices.GetRequiredService<IUrlHelper>();
    ViewBag.Url = urlHelper.Action("Contact", "Home", new { foo = 1 });
    
    Run Code Online (Sandbox Code Playgroud)
  • 在过滤器中,您可以:

    public void OnActionExecuted(ActionExecutedContext context)
    {
        var urlHelper = context.HttpContext.RequestServices.GetRequiredService<IUrlHelper>();
        var actionUrl = urlHelper.Action("Contact", "Home", new { foo = 1 });
        //use actionUrl ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

另一种选择是利用内置的依赖注入,例如你的控制器可以有一个像下面这样的构造函数,并在运行时提供一个IUrlHelper实例:

private IUrlHelper _urlHelper;
public HomeController(IUrlHelper urlHelper)
{
    _urlHelper = urlHelper;
}
Run Code Online (Sandbox Code Playgroud)


Dev*_*iss 12

以为我会分享即将到来的RC2,因为目前的答案将不再适用.

从RC 2开始,您需要显式注册IActionContextAccessorIUrlHelperFactory

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddSingleton<IUrlHelperFactory, UrlHelperFactory>();
Run Code Online (Sandbox Code Playgroud)

然后使用DI /服务定位器:

public EmailTagHelper(IUrlHelperFactory urlHelperFactory, IActionContextAccessor actionContextAccessor)
{
  _urlHelper = urlHelperFactory.GetUrlHelper(actionContextAccessor.ActionContext);
}
Run Code Online (Sandbox Code Playgroud)

我在这里写了关于TagHelpers的博客:http://devonburriss.me/asp-net-5-tips-urlhelper


tch*_*dze 5

Startup.cs

   services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
   services.AddSingleton<IUrlHelperFactory, UrlHelperFactory>();
   services.AddScoped(it => it.GetService<IUrlHelperFactory>()
                    .GetUrlHelper(it.GetService<IActionContextAccessor>().ActionContext));
Run Code Online (Sandbox Code Playgroud)

或者

PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper 
Run Code Online (Sandbox Code Playgroud)

Startup.cs

services.AddUrlHelper();
Run Code Online (Sandbox Code Playgroud)

  • @IvanMontilla 好问题。原因是它需要当前的`ActionContext` 才能运行。 (2认同)