#asp.net-mvc-3 #asp.net-mvc-routing
#asp.net-mvc-3 #asp.net-mvc-routing
Вопрос:
Как настроить asp.net маршрутизация mvc для постоянного перенаправления 301
hocalhost/Products.aspx и hocalhost/Search.aspx
Для
hocalhost/Продукты и hocalhost/Поиск
т.е. удалить расширение .aspx из пути?
Ответ №1:
Что-то в этом роде должно сработать. Проложите следующий маршрут:
routes.MapRoute("Redirect route", "{file}.aspx",
new { controller = "home", action = "redirect" });
И определите Redirect
действие в вашем контроллере:
public ActionResult Redirect()
{
// use Request.RawUrl, for instance to parse out what was invoked
// this regex will extract anything between a "/" and a ".aspx"
var regex = new Regex(@"(?<=/). (?=.aspx)", RegexOptions.Compiled);
var action = regex.Match(Request.RawUrl);
return RedirectToActionPermanent(action.Value);
}
Вы могли бы перенаправить обе aspx
страницы на один и тот же маршрут перенаправления и определить, какой файл на самом деле был вызван путем синтаксического анализа HttpContext.Request.RawUrl
(хотя для этого последнего пункта может быть лучший способ).
Обновить
Действительно, есть более простой способ, как выяснил сам @alex. Чтобы получить файл в исходном запросе, просто выполните:
string file = RouteData.Values["file"].ToString();
Комментарии:
1. Это работает, спасибо. Но нам нужно более общее решение, поскольку. страниц aspx может быть много.
2. @alex — как насчет использования параметра в определении url? Я обновил свой ответ, чтобы отразить то, что я имею в виду.
3. @alex — Я только что попробовал этот маршрут, и он сработал: я установил точку останова в
Redirect
методе, и он прерывается там для каждого запроса .aspx, который я делаю . Я также добавил предложение о том, как разобратьRequest.RawUrl
. Когда вы говорите, что это не работает, вы получаете какую-либо ошибку?4. @alex — Готово. Я также исправил регулярное выражение; у меня там была опечатка.
5. Я не могу понять, но Support.aspx не входит в действие перенаправления 🙁