如何使用两个可选路由值配置路由?

How do I configure routing with two optional route values?

这是我在 Startup.cs 中的路由配置:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}/{tab?}");
});

我的一些观点同时使用了 idtab,有些只是 id,有些只是 tab.

idGuid 类型,tabint.

类型

如何配置我的路由以将下面 url 中的 id 部分 (/0) 删除到不使用它的视图?

/Home/Index/0/3 // id is not relevant, tab = 3

在这种情况下,我必须将 id 设置为 0 才能使 url 起作用。这是一个索引视图,子部分以选项卡形式组织。

请试试这个代码

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}/{tab}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, tab= UrlParameter.Optional }
            );
        }

这就像我们可以传递变量类型和引用类型参数

这似乎可以解决问题:

[Route("Home/{tab?}")]
public async Task<IActionResult> Index(string tab)
{
    // do stuff
}

为此你可以做类似的事情。根据您的评论,Id 是 guid,tab 是 int。

app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                  name: "onlyid",
                  pattern: "{controller=Home}/{action=Index}/{id:guid}", new { tab = default(int) });

                endpoints.MapControllerRoute(
                   name: "onlytab",
                   pattern: "{controller=Home}/{action=Index}/{tab:int}", new { id = default(Guid) } );

                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id:Guid}/{tab:int}");
            });

现在,如果只有选项卡,那么只有选项卡会被选中,并且它具有 Guid (Guid.Empty) 的默认值,但您可以像 /Home/Index/1 这样的地址。

如果只有 id 则 onlyId 将被选中并且它具有整数的默认值。 Home/Index/yourguid

如果您都通过了,则选择第三条路线。

作为控制器的方法如下所示。

 public IActionResult Index(Guid? id,int? tab)
        {
            return Ok(new { Id = id, Tab = tab });
        }