#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, если вы хотите сопоставить другие символы, вы можете изменить шаблон.