【问题标题】:ASP.NET Core UrlHelper and how it worksASP.NET Core UrlHelper 及其工作原理
【发布时间】:2018-09-27 12:24:41
【问题描述】:

我对 ASP.NET Core 比较陌生,现在我正试图了解 UrlHelper 的一般工作原理。

在我的控制器中,我想为同一控制器中的另一个操作创建一个绝对 URL,例如http://localhost:PORT/api/controller/action。现在的问题是,我该怎么做?

我尝试了以下方法:

var urlHelper = new UrlHelper(new ActionContext());
var url = urlHelper.Action("ACTION", "CONTROLLER");

此外,像ActionContext 这样的不同上下文是什么?

【问题讨论】:

    标签: c# api asp.net-core urlhelper


    【解决方案1】:

    您真的不应该自己创建UrlHelper。无论您当前处于何种上下文中,很可能已经有一个 IUrlHelper 实例可用:

    所以很有可能,您只需访问 this.Url 即可获得 URL 帮助程序。

    如果您发现自己处于不存在的情况下,例如在实现自己的服务时,那么您始终可以将IUrlHelperFactoryIActionContextAccessor 一起注入以首先检索当前操作上下文,然后创建一个它的 URL 助手。

    至于ActionContext 是什么,它基本上是一个包含各种值的对象,这些值标识当前正在处理当前请求的当前MVC 操作上下文。因此它包含有关实际请求、已解析控制器和操作的信息,或有关绑定模型对象的模型状态。它基本上是HttpContext 的扩展,还包含特定于MVC 的信息。


    如果您运行的是 ASP.NET Core 2.2 或更高版本,您还可以在服务中使用 LinkGenerator 而不是 IUrlHelper,与必须通过IUrlHelperFactory.

    【讨论】:

    • 在 Startup.ConfigureServices 我需要设置 services.ConfigureApplicationCookie 的 LoginPath 选项...所以我不在任何页面或视图中。在这种情况下 UrlHelper 不可用并且 LinkGenerator 是一个抽象类.使用硬编码字符串似乎在大多数情况下都有效,但并非适用于所有环境。看起来我们必须为此添加配置?
    • @LouisSomers 您可以为此使用基于 DI 的配置:services.AddOptions<CookieAuthenticationOptions>(IdentityConstants.ApplicationScheme).Configure<LinkGenerator>((options, generator) => { options.LoginPath = generator.GetPathByAction(…); }) – 如果您无法使用,请随时在此处创建一个新问题并链接到它。
    • 谢谢,我尝试注入,但现在出现异常 System.InvalidOperationException: 'Unable to resolve service for type 'Microsoft.AspNetCore.Routing.LinkGenerator' 同时尝试激活 'MyApp.Startup'。 '。也许您可以为this question 添加答案,因为app.UsePathBase() 似乎不是完整的答案(它不会自动更改硬编码的"~/..." 路径)。 public IActionResult Login(string returnUrl = "~/"){...} 中的静态或默认值呢?
    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 2012-03-23
    • 2013-04-22
    • 1970-01-01
    • 2021-06-07
    • 2020-07-16
    • 2011-11-08
    相关资源
    最近更新 更多