.NET Core API为带路由参数端点生成URL,解决Url.ActionLink返回null问题
问题原因
- 你当前给Action标注的
[Route("{value}/download")]特性没有包含控制器占位符,不符合你需要的{控制器名}/{路由值}/action名路径结构,路由系统无法匹配你传入的控制器参数,所以返回null - 你写的Action名大小写错误,方法实际名为
Download,你传入的是DownLoad,同时路由参数名value是小写,你传的匿名类用了大写Value,路由匹配时参数不对应也会导致生成失败 - ActionLink方法第一个参数只能传入纯Action方法名,不能拼接路由参数前缀,所以第二种写法本身逻辑错误
正确实现方案
方案1:调整路由特性匹配目标路径结构
首先修改Action的路由特性,加入控制器和Action的占位符,匹配你需要的路径规则:
// [controller] 会自动替换为控制器类名去掉Controller后缀的部分,[action]自动替换为方法名 [Route("[controller]/{value}/[action]")] public IActionResult Download([FromRoute] string value) { // 你的业务逻辑 }
然后使用如下代码生成链接即可,注意将你的控制器名替换为你实际的控制器名(去掉Controller后缀,比如你的控制器是FileController就填File):
Url.ActionLink("Download", "你的控制器名", new { value = 你的路由值参数 }, protocol: "https")
方案2:给路由指定名称直接生成(适用于不需要改现有路由结构的场景)
如果不想修改现有路由规则,可以给路由特性指定唯一名称,直接按名称生成链接:
[Route("{value}/download", Name = "DownloadFileEndpoint")] public IActionResult Download([FromRoute] string value) { // 你的业务逻辑 }
生成链接代码:
Url.Link("DownloadFileEndpoint", new { value = 你的路由值参数 })
注意:该方案生成的路径不会包含控制器名,不符合你要求的路径结构,仅作为不需要控制器段时的备选方案
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

