Это моя конфигурация маршрута в Startup.cs:

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

Некоторые из моих взглядов используют как id, так и tab, некоторые просто id, а некоторые просто tab.

id имеет тип Guid, а tab имеет тип int.

Как я могу настроить маршрутизацию так, чтобы исключить часть id (/0) в следующем URL-адресе для представления, которое ее не использует?

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

В этом случае мне нужно установить id на 0, чтобы URL работал. Это индексное представление с подразделами, организованными по вкладкам.

1
Stian 4 Июл 2021 в 09:10

3 ответа

Лучший ответ

Для этого можно сделать что-то вроде. В соответствии с вашим комментарием идентификатор - это guid, а вкладка - 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}");
            });

Теперь, если есть только вкладка, тогда будет выбираться onlyTab, и он имеет значение по умолчанию для Guid (Guid.Empty), но вы можете обращаться как / Home / Index / 1.

Если есть только идентификатор, будет выбран onlyId, и он будет иметь значение по умолчанию для целого числа. Главная / Индекс / yourguid

Если вы пройдете оба, будет выбран третий маршрут.

Метод как контроллер выглядит следующим образом.

 public IActionResult Index(Guid? id,int? tab)
        {
            return Ok(new { Id = id, Tab = tab });
        }
1
dotnetstep 4 Июл 2021 в 14:21

Пожалуйста, попробуйте этот код

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 }
            );
        }

enter image description here

введите описание изображения здесь это как мы можем передать тип переменной и параметр ссылочного типа

0
Anoob 4 Июл 2021 в 08:52

Кажется, это помогает:

[Route("Home/{tab?}")]
public async Task<IActionResult> Index(string tab)
{
    // do stuff
}
0
Stian 4 Июл 2021 в 11:30