Как мне сделать короткие URL в MVC?

Предположим, я хочу опубликовать (как в бумажных каталогах) некоторые "короткие URL", которые легко набирать / запоминать, но я хочу, чтобы они перенаправляли на подробный, оптимизированный для SEO URL. Как мне сделать это с маршрутами MVC?

Пример:

http://mysite.com/disney

становится

http://mysite.com/travel/planning-your-disney-vacation (с "путешествием" в качестве контроллера)

Вещи, которые я пробовал:

  1. Просто установите для него маршрут. Проблема: URL не изменяется в браузере (он остается "/disney".

  2. Используйте пакет NuGet RouteMagic (см. Статью Haacked). Проблема: я получаю ошибку: RouteData должен содержать элемент с именем 'controller' с непустым строковым значением. Я думаю, это потому, что у меня нет статического слова перед моим контроллером ("travel"), как у него (с "foo" и "bar")???

  3. Используйте модуль перенаправления (например, Ian Mercer's). Проблема: маршрут совпадает с моим HTML.ActionLinks при создании URL-адресов, которые я не хочу (Haacked упоминает об этом в своей статье и говорит, что именно поэтому GetVirtualPath возвращает NULL ...?)

У меня нет идей, поэтому любая будет оценена! Спасибо!

3 ответа

Решение

Вы можете настроить маршрут типа "ловить все", чтобы направлять все / что-то запросы конкретному действию и контроллеру, что-то вроде:

routes.MapRoute(
    "ShortUrls",
    "{name}",
    new {controller = "ShortUrl", action = "Index", name = UrlParameter.Optional}
);

(в зависимости от того, как настроена остальная часть вашей маршрутизации, вы, вероятно, не захотите делать это в точности так, как это может вызвать у вас серьезные головные боли при маршрутизации - но здесь это работает ради простоты)

Затем просто перенаправьте действие на нужный URL-адрес на основе указанного значения:

public class ShortUrlController : Controller
{
    //
    // GET: /ShortUrl/

    public ActionResult Index(string name)
    {
        var urls = new Dictionary<string, string>();
        urls.Add("disney", "http://mysite.com/travel/planning-your-disney-vacation");
        urls.Add("scuba", "http://mysite.com/travel/planning-your-scuba-vacation");

        return Redirect(urls[name]);
    }
}

Я просто столкнулся с той же проблемой. В моем глобальном:

routes.MapRoute(
    "ShortUrls",
    "{name}",
    new { controller = "Home", action = "Index", name = UrlParameter.Optional }
);

В моем домашнем контроллере:

public ActionResult Index(string name)
{
    return View(name);
}

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

Чтобы сократить URL, вы должны использовать технику перезаписи URL.

Некоторые учебники по теме:

Другие вопросы по тегам