Ответ 1
Обновление - сообщение 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);
}
Вам также необходимо зарегистрировать в своем классе запуска (IUrlHelperFactory
уже зарегистрирован по умолчанию):
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
Помните, что это будет работать только до тех пор, пока код, где вы получаете actionContext, запускается после промежуточного программного обеспечения MVC/routing! (В противном случае actionAccessor.ActionContext
будет null)
Я получил IUrlHelper
с помощью IServiceProvider
в HttpContext.RequestServices
.
Обычно у вас будет свойство HttpContext
:
-
В методе действий контроллера вы можете:
var urlHelper = this.Context.RequestServices.GetRequiredService<IUrlHelper>(); ViewBag.Url = urlHelper.Action("Contact", "Home", new { foo = 1 });
-
В фильтре вы можете:
public void OnActionExecuted(ActionExecutedContext context) { var urlHelper = context.HttpContext.RequestServices.GetRequiredService<IUrlHelper>(); var actionUrl = urlHelper.Action("Contact", "Home", new { foo = 1 }); //use actionUrl ... }
Другим вариантом будет использование встроенной инъекции зависимостей, например, у вашего контроллера может быть такой конструктор, как следующий, и во время выполнения будет предоставлен экземпляр IUrlHelper
:
private IUrlHelper _urlHelper;
public HomeController(IUrlHelper urlHelper)
{
_urlHelper = urlHelper;
}