在我的应用程序中,我有一个基本控制器类,它定义了两个路由:
// 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是指使用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})