使用路由值在 .net core api 中生成 url 链接

Posted

技术标签:

【中文标题】使用路由值在 .net core api 中生成 url 链接【英文标题】:Generate a url link in .net core api with route values 【发布时间】:2021-12-01 18:15:35 【问题描述】:
[route("value/download")]
Public IactionResult Download([fromroute] string value)


我想为上面的端点生成一个链接,我尝试使用下面的 actionlink 来生成 URL,但它返回一个空值。

输出应该是 https://hostname/controlername/routevalue/actionname

Url.ActionLink($"DownLoad", "controller", new  Value= value, protocol: "https")
Url.ActionLink($"value/DownLoad", "controller", new  Value= value, protocol: "https")

【问题讨论】:

嗨@Nikhil,我想你可能不理解UrlHelper。 value/DownLoad 不是动作名称,动作名称是Download。 UrlHelper 会动态找到action和controller,如果你指定了正确的参数,就会为你生成正确的请求url。 【参考方案1】:

此代码已在 Visual Studio 中测试过

如果您需要链接,对于复杂的路线,您必须使用路线名称

[Route("[controller]/value/download", Name ="download")]
public IActionResult Download(string value)

并查看

@html.RouteLink( "Go to download", "download", "https",null,null, new  Value=value,null)

它会生成url

http://xxxx/controller/value/download

【讨论】:

【参考方案2】:

我尝试使用下面的 actionlink 来生成 URL,但它返回一个空值

那是因为 UrlHelper 在控制器中找不到这样的动作名称(value/DownLoad)。

你需要查看Url.ActionLink源代码来了解每个参数代表什么:

//
// Summary:
//     Generates an absolute URL for an action method, which contains the specified
//     action name, controller name, route values, protocol to use, host name, and fragment.
//     Generates an absolute URL if the protocol and host are non-null. See the remarks
//     section for important security information.
//
// Parameters:
//   helper:
//     The Microsoft.AspNetCore.Mvc.IUrlHelper.
//
//   action:
//     The name of the action method. When null, defaults to the current executing action.
//
//   controller:
//     The name of the controller. When null, defaults to the current executing controller.
//
//   values:
//     An object that contains route values.
//
//   protocol:
//     The protocol for the URL, such as "http" or "https".
//
//   host:
//     The host name for the URL.
//
//   fragment:
//     The fragment for the URL.
//
// Returns:
//     The generated URL.
//
// Remarks:
//     The value of host should be a trusted value. Relying on the value of the current
//     request can allow untrusted input to influence the resulting URI unless the Host
//     header has been validated. See the deployment documentation for instructions
//     on how to properly validate the Host header in your deployment environment.
public static string ActionLink(this IUrlHelper helper, string action = null, string controller = null, object values = null, string protocol = null, string host = null, string fragment = null);

然后你需要修改如下代码:

@Url.ActionLink($"Download", "ControllerName", new  Value= value, protocol: "https")

后端代码:

[Route("[controller]")]
public class HomeController : Controller   //controller name here is Home

    [Route("value/download")]
    public IActionResult Download([FromRoute] string value)
    
        return Ok();
    

【讨论】:

感谢您的解决方案。仍然,它返回空值。在下载端点 Url.ActionLink($"Download", "ControllerName", new Value= value, protocol: "https") 中使用它之后 您指定控制器名称吗?请与控制器分享您的操作。不知道你的控制器怎么样。 只有你的项目存在这样的controller和action,urlhelper才能生成正确的请求url。

以上是关于使用路由值在 .net core api 中生成 url 链接的主要内容,如果未能解决你的问题,请参考以下文章

在 .Net Core 控制台应用程序中生成受信任的自签名证书

技术帖 | 在 Azure 应用服务中生成 .NET Core 和 SQL 数据库 Web 应用

不同的 <prosody> ssml 值在 Google Text to Speech 中生成相同的音频

asp.net core 系列 5 MVC框架路由(上)

ASP.net Core API 中的路由

使用 .NET Core 3.1 生成 WCF wsdl 客户端的问题