Возврат 301 перенаправления из действия контроллера
В ASP.net MVC, каков "правильный" способ заставить контроллер возвратить 301 перенаправление на внешний сайт?
Различные функции RedirectTo, похоже, возвращают только относительные ссылки или маршруты, которые я сопоставил вручную, но нет способа сказать: "Выполните 301 перенаправление на http://example.com".
Я думаю, что могу просто установить Response.StatusCode или использовать Response.Redirect, но так ли это должно быть сделано в MVC? Или существует официальный "правильный способ" перенаправления?
Обновление:. Тем временем я написал ActionResult для этого: PermanentRedirectResult
Обновление 2: Поскольку ASP.net 4.0, постоянные переадресации часть Framework.
Ответы
Ответ 1
Поскольку вы говорите о перенаправлении на URL-адрес, который вы ничего не знаете о маршрутизации (будь то внутренняя страница (думаю, классический ASP.NET) или какой-то внешний ресурс), то единственное, что вы можете сделать, это установить код статуса и отправить браузер пользователя на своем пути.
В этой цепочке в MVC вы беспокоитесь о том, чтобы получить доступ к своему представлению, но этот вид не находится под вашим контролем и даже не может быть просмотром. Поэтому, в конечном счете, вы делаете это лучше всего в этом случае, и, насколько мне известно, не нарушают правило MVC.
Надеюсь, это поможет.
Ответ 2
Использование
Response.RedirectPermanent("http://www.google.com");
или для возврата типа ActionResult из контроллера:
return RedirectPermanent("http://www.google.com");
предоставляемый инфраструктурой ASP.net 4.0.
Ответ 3
Я выполняю перенаправления для поддержки устаревших URL-адресов.
Мой контроллер выглядит примерно так: & hellip;
Public Class ThingController
Inherits System.Web.Mvc.Controller
Function Details(ByVal id As String) As ActionResult
Dim RedirectId As Guid
Select Case key
Case "legacyurlone"
RedirectId = New Guid("c564c0c1-c365-4b0c-bc33-fd4eadf0551b")
Case "legacyurltwo"
RedirectId = New Guid("157fa15b-8d5d-4f04-87cc-434f7ae93dfa")
Case Else
RedirectId = Guid.Empty
End Select
If Not RedirectId = Guid.Empty Then
Response.StatusCode = Net.HttpStatusCode.MovedPermanently
Response.RedirectLocation = Url.RouteUrl("IdOnly", New With {.id = RedirectId})
Return Nothing
End If
Dim ThingId As Guid = New Guid(id)
Dim db As New ThingEntities
Dim Model As Thing = ...
Return View(Model)
End Function
...
End Class
Теперь я задаюсь вопросом, могу ли я обработать это более чисто с двумя маршрутами и функциями контроллера.
Ответ 4
Это помогает? http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx
Похоже, вам просто нужно будет заменить виртуальный путь по URL-адресу, который вам нравится.