Update - post RC2
Jak @deebo wspomniano, już nie mogą otrzymać IUrlHelper
bezpośrednio z DI. Zamiast tego trzeba wstrzykiwania IUrlHelperFactory
oraz IActionContextAccessor
do swojej klasy i używać ich, aby uzyskać instancję IUrlHelper
jak w:
public MyClass(IUrlHelperFactory urlHelperFactory, IActionContextAccessor actionAccessor)
{
this.urlHelperFactory = urlHelperFactory;
this.actionAccessor = actionAccessor;
}
public void SomeMethod()
{
var urlHelper = this.urlHelperFactory.GetUrlHelper(this.actionAccessor.ActionContext);
}
Trzeba także zarejestrować w swojej klasie startowej (IUrlHelperFactory
jest już zarejestrowany domyślnie):
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
Pamiętaj, to będzie działać tylko tak długo, jak kod gdzie masz actionContext działa po/routingu middleware MVC! (W przeciwnym razie actionAccessor.ActionContext
byłby zerowy)
I pobraniu IUrlHelper
pomocą IServiceProvider
w HttpContext.RequestServices
.
Zwykle trzeba będzie właściwość HttpContext
pod ręką:
w sposobie działania kontrolera można zrobić:
var urlHelper = this.Context.RequestServices.GetRequiredService<IUrlHelper>();
ViewBag.Url = urlHelper.Action("Contact", "Home", new { foo = 1 });
w filtrze można zrobić:
public void OnActionExecuted(ActionExecutedContext context)
{
var urlHelper = context.HttpContext.RequestServices.GetRequiredService<IUrlHelper>();
var actionUrl = urlHelper.Action("Contact", "Home", new { foo = 1 });
//use actionUrl ...
}
Innym rozwiązaniem mogłoby być wykorzystanie wbudowanego wstrzykiwania zależności, na przykład kontroler może mieć konstruktor jak poniżej jednej i w czasie wykonywania instancji IUrlHelper
będą dostarczone:
private IUrlHelper _urlHelper;
public HomeController(IUrlHelper urlHelper)
{
_urlHelper = urlHelper;
}
* facepalm * Nie wiedziałem, że mogę dostać pomocnika url poprzez dependancy iniekcji, jak byłem pod wrażeniem, że ten było coś, co należało dodać do usług. – Marqueone