Настройка индекса в качестве маршрута по умолчанию для контроллера - PullRequest
7 голосов
/ 10 марта 2011

У меня есть URL

которую я хочу превратить в

Это также может быть что-то вроде http://www.roadkillwiki.org/Page/my-url-with-spaces - параметр является строкой. Настройка маршрута, которую я пробовал:

routes.MapRoute(
    "ControllerDefault",
    "{controller}/{id}",
    new { controller = "Page", action = "Index", id = UrlParameter.Optional }
);

Однако это мешает стандартному маршруту "id", с которым идут проекты MVC. Есть ли способ достичь этого?

Ответы [ 2 ]

17 голосов
/ 10 марта 2011

Вам не нужно терять маршрут по умолчанию.Ключом к тому, чтобы ваши маршруты не мешали друг другу, нужно упорядочить их так, чтобы более конкретные правила предшествовали менее конкретным.Например:

// 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 при каждом переименовании страницы.

Надеюсь, это поможет.

2 голосов
/ 10 марта 2011

Если вам не нужен маршрут по умолчанию, который поставляется с шаблоном проекта, вы можете настроить его следующим образом:

routes.MapRoute(
    "ControllerDefault",
    "{controller}/{pagename}",
    new { controller = "Page", action = "Index" }
);

И тогда в вашем контроллере будет выполнено действие:

        public ActionResult Index(string pagename)
        {
            //do something
        }
...