Как мне сделать короткие URL в MVC?
Предположим, я хочу опубликовать (как в бумажных каталогах) некоторые "короткие URL", которые легко набирать / запоминать, но я хочу, чтобы они перенаправляли на подробный, оптимизированный для SEO URL. Как мне сделать это с маршрутами MVC?
Пример:
становится
http://mysite.com/travel/planning-your-disney-vacation (с "путешествием" в качестве контроллера)
Вещи, которые я пробовал:
Просто установите для него маршрут. Проблема: URL не изменяется в браузере (он остается "/disney".
Используйте пакет NuGet RouteMagic (см. Статью Haacked). Проблема: я получаю ошибку: RouteData должен содержать элемент с именем 'controller' с непустым строковым значением. Я думаю, это потому, что у меня нет статического слова перед моим контроллером ("travel"), как у него (с "foo" и "bar")???
- Используйте модуль перенаправления (например, 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.
Некоторые учебники по теме: