/ / Маршрутизація MVC - конфлікт між параметром та ім'ям контролера - asp.net-mvc, asp.net-mvc-4

Маршрутизація MVC - конфлікт між назвою параметра та контролера - asp.net-mvc, asp.net-mvc-4

Як я можу вирішити наступні правила маршрутизації без явного підключення їх?

Я хотів би додати дружні 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 = "" });

Якщо вони дотримуються певного зразка, ви можете додати новий маршрут, який би обробляв ці промо-акції, додавши обмеження за допомогою регулярного виразу.