我需要能够控制我的生成的链接Url.Content("~")
调用以能够在链接的开头接受 Slug。基本上,托管 URL 将位于负载平衡器后面,并且可能位于根级别或位于更友好的 Url 后面...
举个例子:
该站点配置为在以下环境下运行http://本地主机:5001 http://localhost:5001, so Url.Content("~/scripts/site.js")
将生成"/scripts/site.js"
如果浏览器直接访问该 URL,甚至访问别名(例如 www.mysite.com),则这很好。
但我希望能够灵活地将网站托管在 www.mysite.com/Slug 下(想想证书等)...
现在,我生成的链接转到 www.mysite.com/scripts.site.js,该链接解析为 404。
理想情况下,可以在自定义中配置 slugIUrlHelper
,甚至是自定义LinkGenerator
,但我似乎无法注入这些并覆盖当前的。
我试过了:
services.AddScoped<IUrlHelper>(x =>
{
var actionContext = x.GetService<IActionContextAccessor>().ActionContext;
return new MyCustomUrlHelper(actionContext);
});
但无法注射。当我尝试调试时,我注意到如果您在控制器中调用相同的命令,您会得到一个实例Microsoft.AspNetCore.Mvc.Routing.EndpointRoutingUrlHelper
反而。
有没有办法在不创建自定义帮助器的情况下改变这一点(因为在某些区域会错过这一点,并使调试几乎不可能找到误用的帮助器)
Binding IUrlHelper
直接没有任何效果,因为 MVC 在内部使用工厂解析实例。要在控制器和 razor 视图中获取您自己的自定义 URL 帮助器的实例,您需要提供以下自定义实现IUrlHelperFactory
在你的启动课程中。
以下代码片段允许您使用自己的功能来装饰原始 URL 帮助器:
In your Startup
类,您需要添加自定义实现IUrlHelperFactory
具有单例作用域after AddMvc
:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSingleton<IUrlHelperFactory, CustomUrlHelperFactory>();
}
自定义实现可能如下所示:
public class CustomUrlHelper : IUrlHelper
{
private IUrlHelper _originalUrlHelper;
public ActionContext ActionContext { get; private set; }
public CustomUrlHelper(ActionContext actionContext, IUrlHelper originalUrlHelper)
{
this.ActionContext = actionContext;
this._originalUrlHelper = originalUrlHelper;
}
public string Action(UrlActionContext urlActionContext)
{
return _originalUrlHelper.Action(urlActionContext);
}
public string Content(string contentPath)
{
return _originalUrlHelper.Content(contentPath);
}
public bool IsLocalUrl(string url)
{
return _originalUrlHelper.IsLocalUrl(url);
}
public string Link(string routeName, object values)
{
return _originalUrlHelper.Link(routeName, values);
}
public string RouteUrl(UrlRouteContext routeContext)
{
return _originalUrlHelper.RouteUrl(routeContext);
}
}
public class CustomUrlHelperFactory : IUrlHelperFactory
{
public IUrlHelper GetUrlHelper(ActionContext context)
{
var originalUrlHelperFactory = new UrlHelperFactory();
var originalUrlHelper = originalUrlHelperFactory.GetUrlHelper(context);
return new CustomUrlHelper(context, originalUrlHelper);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)