【问题标题】:How to generate specific action URL when I have multiple route attributes?当我有多个路由属性时如何生成特定的操作 URL?
【发布时间】: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


【解决方案1】:

这感觉就像您的 inline 变量需要是这样的:一个适当的变量,传入以便您可以读取值。是的,这使方法声明复杂化了,但它也清楚地向以后维护事物的任何人表明您正在将它用于特定的事情。感觉就像是为了设置布局而做了大量的体操,所以也许需要进行一些重构,这样你就不会走这条路了?

好的,编辑为我在这里的想法抛出一个“例如”:

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

我可能弄错了变量声明的语法(不确定我是否可以在这种情况下分配默认值等),但值得一试吗?

不过,您会遇到麻烦,因为该路线可能与包含初始 bool 参数的其他路线无法区分,因此我倾向于在路线的后面移动它,可能是最后的(可选)参数。

【讨论】:

  • 我不明白你所说的“变量”是什么意思。你能提供一个这样的系统的例子吗?此外,当使用 Url.Action 或类似方法时,这样的“变量”如何帮助生成正确的 url?
  • 我稍微修改了我的答案。不确定它是否会起作用,但值得一试吗?
猜你喜欢
  • 2017-11-21
  • 2013-01-16
  • 2017-10-07
  • 2016-09-22
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多