【发布时间】:2019-05-28 15:44:38
【问题描述】:
在我的应用程序中,我有一个基本控制器类,它定义了两个路由:
// OPControllerBase.cs
[ApiController]
[Route("/[controller]", Order = 1)]
[Route("/inline/[controller]", Order = 2)]
public abstract class OPControllerBase : Controller
{
}
我所有的派生控制器都可以通过 /[controller] 或 /inline/[controller] 访问。单个动作用 HttpGet/Post 修饰,并可能提供表示该动作的附加路由段。 这是一个派生的控制器示例:
public class ProductController : OPControllerBase
{
[HttpGet("Edit/{code}")]
public IActionResult Edit(string code)
{
// accessible via both:
// /Product/Edit/CODE
// /inline/Product/Edit/CODE
}
}
在我的 _ViewStart.cshtml 中,我基本上根据调用控制器的路由来决定布局:
// _ViewStart.cshtml
@{
var path = ViewContext.HttpContext.Request.Path.Value;
if(path.StartsWith("/inline/"))
{
Layout = "_InlineLayout";
}
else
{
Layout = "_FullLayout";
}
}
我遇到的问题是,在我的视图中,我需要根据调用控制器的方式生成一个路由。如果控制器是通过'/inline/[controller]' 路由调用的,那么我想生成以'/inline/.另外我还想选择在某些场景下生成哪条路由。
目前,每当我生成 Url 时,它总是使用第一条路线。 如何强制它使用第二个?
编辑: 只是为了澄清当我说“生成” URL 时,我的意思是使用 Url.Action 或类似方法。当然,我总是可以明确地写 url:
var productCode = "TEST";
var fullRoute = "/Product/Edit/" + productCode
var inlineRoute = "/inline/Product/Edit/" + productCode
...但这不是我想做的。我想要的是类似的东西(只是一个当然不起作用的例子):
var productCode = "TEST";
var fullRoute = Url.Action("Edit", "Product", new { code=productCode , inline = false})
var inlineRoute = Url.Action("Edit", "Product", new { code=productCode , inline = true})
【问题讨论】:
-
为什么不向控制器注入一个服务接口并在其中编写函数呢?这样,您可以在查询中获取到相关控制器端点的枚举值,然后您将能够根据需要调用和处理不同类型的请求。
-
@Hasan 我不明白你的意思。有哪些功能?我的路由工作得很好,问题是如果我有两个可能的路由,例如我在示例中所述的(如果我想通过 Url.Action 或类似方法生成路由),如何生成控制器/操作 Url。
标签: c# .net model-view-controller asp.net-core routes