Як я можу вирішити наступні правила маршрутизації без явного підключення їх?
Я хотів би додати дружні URL-адреси з міркувань просування, наприклад:
domain.com/promoA
domain.com/promoB
Цим повинен займатися один контролер "рекламних акцій". (Я не проти, якщо цим займається контролер "домашнього")
Тоді я хотів би, щоб URL-адреси наступної форми були зіставлені безпосередньо з контролером
domain.com/account ---> controller=account, action=index
domain.com/account/login ---> controller=account, action=login
domain.com/product/list ---> controller=product, action=list
domain.com ---> controller=home, action=index
Це можливо?
Дякую!
Відповіді:
1 для відповіді № 1Я не впевнений, що це найпростіший спосіб, але ви можете встановити маршрут з обмеженнями. Просто переконайтеся, що заявили про це перед іншими маршрутами.
routes.MapRoute(
"Promos", // Route name
"{action}", // URL with parameters
new { controller = "Promotions", }, // Parameter defaults
new { action = new PromoConstraint(), }
);
Де PromoConstraint визначається як
public class PromoConstraint : IRouteConstraint
{
private readonly List<string> _promos = new List<string> { "promoA", "promoB", };
public bool Match(
HttpContextBase httpContext
, Route route
, string parameterName
, RouteValueDictionary values
, RouteDirection routeDirection
) {
object value;
if(!values.TryGetValue(parameterName, out value)) return false;
var str = value as string;
if(str == null) return false;
return _promos.Any(promo => promo.ToLower() == str.ToLower());
}
}
0 для відповіді № 2
Так це можливо.
Все, що вам потрібно зробити, це виконати дію Indexметодом у домашньому контролері перевірте, чи існує наданий товар у таблиці продуктів. Якщо так, поверніть подання для цього товару, інакше просто поверніть подання індексу.
Вам потрібно буде встановити маршрути для всіх інших контролерів, як ви описали у своєму питанні.
І у вашому кореневому маршруті потрібно буде вказати, що він буде приймати необов’язковий параметр "product".
routes.MapRoute("Root", "{product}", new { controller = "Home", action = "Index", product = "" });
Якщо вони дотримуються певного зразка, ви можете додати новий маршрут, який би обробляв ці промо-акції, додавши обмеження за допомогою регулярного виразу.