Я только начал использовать ASP.NET Core MVC и хочу, чтобы один маршрут (глобальный слаг) проходил к нескольким контроллерам и действиям в зависимости от того, какой тип страницы я обслуживаю пользователю. Например, я хочу использовать {* slug} для страниц категорий и продуктов.
Я пытаюсь переопределить контроллер по умолчанию и действие в ограничении.
В прошлых версиях MVC вы могли изменить либо значения ["controller"], либо значения ["action"] в ограничении, и он перенаправил бы на соответствующий контроллер и действие.
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMvc(routes =>
{
routes.MapRoute(
name: "Category",
template: "{*slug}",
defaults: new { controller = "Page", action = "Home" },
constraints: new { slug = new PageConstraint() }
);
});
}
}
public partial class PageConstraint : IRouteConstraint
{
public virtual bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.UrlGeneration)
{
return true;
}
var slug = values["slug"] != null ? values["slug"].ToString() : null;
if (string.IsNullOrWhiteSpace(slug))
{
// Homepage
return true;
}
// Get category service
var categoryService = httpContext.RequestServices.GetRequiredService<ICategoryService>();
var category = categoryService.GetBySlug(slug);
if (category == null)
{
return false;
}
values["controller"] = "Category";
values["action"] = "Listing";
values["category"] = category;
return true;
}
}
В PageConstraint я проверяю, существует ли Категория, и если она существует, она изменяет Контроллер на Категория и Действие на Перечисление в RouteValueDictionary. Однако когда я отлаживаю код до конца, он все равно переходит на страницу контроллера и домашнюю страницу действия.
Кто-нибудь знает, почему это происходит, или есть ли лучший способ сделать это? Я знаю, что у меня может быть одно действие в контроллере, выполняющее всю работу, связанную с этим ограничением, но я бы предпочел разместить код в отдельных контроллерах и действиях.