代码之家  ›  专栏  ›  技术社区  ›  Dalibor Čarapić

当我有多个路由属性时,如何生成特定的操作url?

  •  0
  • Dalibor Čarapić  · 技术社区  · 7 年前

    在我的应用程序中,我有一个基本控制器类,它定义了两个路由:

    // 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})
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   David T. Macknet    7 年前

    感觉像是你的 inline 变量必须是:一个适当的变量,传入以便您可以读取该值。是的,这使方法声明复杂化,但它也清楚地向以后维护东西的任何人表明,您正在将它用于特定的东西。这也让人觉得仅仅是为了得到布局设置就要做大量的工作,所以也许有一些重构工作要做,这样你就不会走这条路了?

    好吧,编辑一下,为我的想法抛出一个“例如”:

    [Route("/{inline:bool=yes}/[controller]")]

    我可能把变量声明的语法弄错了(不确定是否可以在这个上下文中指定默认值,等等),但是值得一试吗?

    不过,这会给您带来麻烦,因为该路径可能与包含初始值的其他路径不可区分 bool 参数,所以我倾向于在稍后的路径中移动它,可能作为最终(可选)参数。