ASP.NET Core 2.0 WebApi:从控制器A生成控制器B的动作URL
在ASP.NET Core 2.0中生成另一个控制器动作的URL
没问题,在ASP.NET Core 2.0里,你可以借助框架自带的UrlHelper轻松实现这个需求,而且你已经给ActionB指定了路由名称ActionB,这会让URL生成更可靠(不用硬编码容易变动的路由模板)。下面是具体的实现方式:
方法一:使用路由名称生成(推荐)
因为你已经给ActionB标记了Name = "ActionB",直接通过这个路由名称生成URL是最稳妥的——就算以后修改ActionB的路由模板或者动作名称,只要路由名称不变,代码就不用调整。
在控制器A的动作方法里,直接使用基类的Url属性调用RouteUrl方法即可:
[Route("api/applications/{idapp}/bcontrollers/{idbcon}/acontrollers")] public class AController : Controller { [HttpGet("{ida}")] public IActionResult ActionA(int idapp, int idbcon, int ida) { // 生成ActionB的完整绝对URL var actionBUrl = Url.RouteUrl( routeName: "ActionB", routeValues: new { idbcon = idbcon }, // 传递路由模板所需的参数 protocol: Request.Scheme, // 从当前请求获取协议(http/https) host: Request.Host.ToUriComponent() // 从当前请求获取主机地址 ); // 如果只需要相对URL,可以省略protocol和host参数 // var actionBRelativeUrl = Url.RouteUrl("ActionB", new { idbcon = idbcon }); return Ok(new { ActionBFullUrl = actionBUrl }); } }
方法二:通过动作和控制器名称生成
如果你更习惯用动作和控制器名称来生成,也可以用Url.Action方法:
var actionBUrl = Url.Action( action: "ActionB", controller: "B", // 注意控制器名称要去掉后缀"Controller" routeValues: new { idbcon = idbcon }, protocol: Request.Scheme, host: Request.Host.ToUriComponent() );
注意事项
- 不需要传递
mediatype参数:因为它是FromHeader的参数,不属于URL的一部分,只需要在实际请求ActionB时在Header中携带即可。 - 避免参数名冲突:你的B控制器路由模板里有两个
{idbcon}(控制器路由和动作路由各一个),实际开发中建议修改参数名区分开,避免混淆和潜在的路由匹配问题。
内容的提问来源于stack exchange,提问作者Guille
相关产品推荐
相关产品推荐

