如何使用两个可选路由值配置路由?
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?}");
});
我的一些观点同时使用了 id
和 tab
,有些只是 id
,有些只是 tab
.
id
是 Guid
类型,tab
是 int
.
类型
如何配置我的路由以将下面 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 });
}
这是我在 Startup.cs
中的路由配置:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}/{tab?}");
});
我的一些观点同时使用了 id
和 tab
,有些只是 id
,有些只是 tab
.
id
是 Guid
类型,tab
是 int
.
如何配置我的路由以将下面 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 });
}