Вам не нужно терять маршрут по умолчанию.Ключом к тому, чтобы ваши маршруты не мешали друг другу, нужно упорядочить их так, чтобы более конкретные правила предшествовали менее конкретным.Например:
// Your specialized route
routes.MapRoute(
"Page",
"Page/{slug}",
new { controller = "Page", action = "Index" }
);
// Default MVC route (fallback)
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
Тогда ваш PageController будет выглядеть так:
using System.Web.Mvc;
public class PageController : Controller
{
public string Index(string slug)
{
// find page by slug
}
}
Тем не менее, я бы настоятельно посоветовал вам сделать это вместо:
// Your specialized route
routes.MapRoute(
"Page",
"Page/{id}/{slug}",
new { controller = "Page", action = "Index", slug = UrlParameter.Optional }
);
// MVC's default route (fallback)
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
И ваш PageController:
using System.Web.Mvc;
public class PageController : Controller
{
public string Index(int id)
{
// find page by ID
}
}
Включив идентификатор страницы либо в начале вашего URL (как это делает StackOverflow), либо в конце, вы можете просто игнорировать слаг,и вместо этого получить ваши страницы по идентификатору.Это избавит вас от головной боли, если ваши пользователи изменят название страницы.Я прошел через это, и это больно;вам в основном нужно вести учет всех имен, которые ваши страницы имели в прошлом, просто чтобы ваши посетители / поисковые системы не получали 404 при каждом переименовании страницы.
Надеюсь, это поможет.