首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法利用UrlHelper

无法利用UrlHelper
EN

Stack Overflow用户
提问于 2015-06-07 17:18:20
回答 5查看 6K关注 0票数 17

我目前正在尝试做一些在ASP.NET 4中非常简单和直接的事情,但是这并不是ASP.NET 5中的情况。

在使用UrlHelper之前,它非常简单:

代码语言:javascript
复制
var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

然而,在我的一生中,我无法思考如何使用新的UrlHelper。我在看测试用例,要么我完全疯了,要么我漏掉了什么东西,我似乎弄不明白。如果能帮上忙的话那就太好了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-06-07 19:40:01

更新-邮政RC2

正如@deebo所提到的,您不再能够直接从DI获得IUrlHelper。相反,您需要将IUrlHelperFactoryIActionContextAccessor注入到类中,并使用它们获取IUrlHelper实例,如下所示:

代码语言:javascript
复制
public MyClass(IUrlHelperFactory urlHelperFactory, IActionContextAccessor actionAccessor)
{
    this.urlHelperFactory = urlHelperFactory;
    this.actionAccessor = actionAccessor;
}

public void SomeMethod()
{
    var urlHelper = this.urlHelperFactory.GetUrlHelper(this.actionAccessor.ActionContext);
}

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

代码语言:javascript
复制
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

请记住,只要您获得actionContext的代码是在MVC/路由中间件之后运行的,这才能工作!(否则actionAccessor.ActionContext将为空)

我已经使用IUrlHelper中的IServiceProvider检索了HttpContext.RequestServices

通常,您手头有一个HttpContext属性:

  • 在控制器操作方法中,您可以: var urlHelper =urlHelper ViewBag.Url = urlHelper.Action("Contact","Home",new { foo =1 });
  • 在过滤器中,您可以: 公共OnActionExecuted(ActionExecutedContext上下文){ var urlHelper =ActionExecutedContext var actionUrl =urlHelper.Action(“联系人”,"Home",新的{ foo =1 });//使用actionUrl .}

另一个选项是利用内置依赖项注入,例如,您的控制器可以有一个构造函数,如下所示,并且在运行时将提供一个IUrlHelper实例:

代码语言:javascript
复制
private IUrlHelper _urlHelper;
public HomeController(IUrlHelper urlHelper)
{
    _urlHelper = urlHelper;
}
票数 20
EN

Stack Overflow用户

发布于 2016-01-18 11:08:42

我想我会分享即将到来的RC2,因为目前的答案将不再起作用。

在RC 2中,您需要显式注册IActionContextAccessor和IUrlHelperFactory。

代码语言:javascript
复制
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddSingleton<IUrlHelperFactory, UrlHelperFactory>();

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

代码语言:javascript
复制
public EmailTagHelper(IUrlHelperFactory urlHelperFactory, IActionContextAccessor actionContextAccessor)
{
  _urlHelper = urlHelperFactory.GetUrlHelper(actionContextAccessor.ActionContext);
}

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

票数 15
EN

Stack Overflow用户

发布于 2017-05-22 08:26:41

Startup.cs

代码语言:javascript
复制
   services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
   services.AddSingleton<IUrlHelperFactory, UrlHelperFactory>();
   services.AddScoped(it => it.GetService<IUrlHelperFactory>()
                    .GetUrlHelper(it.GetService<IActionContextAccessor>().ActionContext));

交替

代码语言:javascript
复制
PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper 

Startup.cs

代码语言:javascript
复制
services.AddUrlHelper();
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30696337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档