Как мне сделать короткие URL в MVC? - PullRequest
2 голосов
/ 01 марта 2012

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

Пример:

http://mysite.com/disney

становится

http://mysite.com/travel/planning-your-disney-vacation (с «ходом» в качестве контроллера)

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

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

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]);
    }
}
1 голос
/ 17 августа 2012

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

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

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

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

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

0 голосов
/ 01 марта 2012

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

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

...