/ / 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

Да, това е възможно.

Всичко, което трябва да направите, е да извършите индексаметод в контролера Home, за да проверите дали предоставеният продукт съществува в таблицата с продукти. Ако е така, върнете изгледа за този продукт, в противен случай просто върнете индекса.

Ще трябва да зададете маршрути за всички останали контролери, както сте описали във вашия въпрос.

И вашият коренен маршрут трябва да посочи, че ще отнеме незадължителен параметър „продукт“.

routes.MapRoute("Root",   "{product}",   new { controller = "Home", action = "Index", product = "" });

Ако те следват определен модел, можете да добавите нов маршрут, който да обработва тези промоции, като добавите ограничение, използвайки редовен израз.