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
使用IServiceProvider
in 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开始,您需要显式注册IActionContextAccessor和IUrlHelperFactory
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
在 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)
归档时间: |
|
查看次数: |
3802 次 |
最近记录: |