Маршрутизация основной категории / подкатегории Dotnet

#c# #.net-core #asp.net-core-mvc

#c# #.net-core #asp.net-core-mvc

Вопрос:

Я создаю ASP.NET Основное приложение MVC, в котором контент поступает из базы данных и находится в структуре категорий / подкатегорий.

Чего я хотел бы достичь в рамках маршрутизации, так это того, что когда пользователь заходит по URL, например: https://mysolution.com/categoryA вызывается контроллер категории. Когда пользователь входит через https://mysolution.com/categoryA/SubCategoryB контроллер подкатегории, должен быть вызван. Поэтому в URL-адресе я не буду использовать имя контроллера или действия, всегда можно вызвать индексное действие и контроллер на основе структуры URL.

Для маршрутизации нет необходимости проверять, существует ли категория или подкатегория в базе данных, это будет обработано контроллером. Маршрутизация должна маршрутизироваться только на основе структуры URL.

Теперь у меня есть следующий код маршрутизации, но он работает не так, как ожидалось.

 endpoints.MapControllerRoute(
                name: "ProductSubCategoryRoute",
                pattern: "{category}/{subcategory}",
                defaults: new { controller = "Subategory", action = "Index" }
            );

endpoints.MapControllerRoute(
                name: "ProductCategoryRoute",
                pattern: "{*category}",
                defaults: new { controller = "Category", action = "Index" }
            );
  

Есть ли у кого-нибудь какие-либо мысли о том, как маршрутизировать на основе структуры категорий / подкатегорий?

С наилучшими пожеланиями,

Ян Виллем

Комментарии:

1. Возможно, это просто опечатка?? controller = "Subategory" — «подкатегория» контроллера? Действительно ? Разве это не должно быть controller = "Subcategory" случайно?

2. Полезен ли мой ответ? Если это полезно, можете ли вы отметить это как ответ? Спасибо.

Ответ №1:

Вы можете попробовать использовать промежуточное программное обеспечение до app.UseRouting(); :

 app.Use(async (context, next) =>
            {
                string pattern1 = "(category[A-Za-z] /subcategory[A-Za-z] )";
                string pattern2 = "(/category[A-Za-z] )";
                var url = context.Request.Path.Value.ToLower();
                var ss = Regex.Matches(url, pattern2);
                if (Regex.Matches(url, pattern2).Count() > 0) {
                    string newurl = "";
                    if (Regex.Matches(url, pattern1).Count() > 0)
                    {
                        
                        newurl = Regex.Replace(url, pattern1, "SubCategory");
                    }
                    else {
                        newurl = Regex.Replace(url, pattern2, "Category");
                  
                    }
                    context.Response.Redirect(newurl);
                    return;
                }
               

                await next();
            });
            app.UseRouting();
  

И вот моя конечная точка:

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

Промежуточное программное обеспечение может помочь вам изменить https://mysolution.com/categoryA https://mysolution.com/Category/Index , изменить https://mysolution.com/categoryA/SubCategoryB https://mysolution.com/SubCategory .
Пример регулярного выражения может совпадать только с категорией A-Z или a-z, если вы хотите сопоставить другие символы, вы можете изменить шаблон.