Подтвердить что ты не робот

Возврат 301 перенаправления из действия контроллера

В ASP.net MVC, каков "правильный" способ заставить контроллер возвратить 301 перенаправление на внешний сайт?

Различные функции RedirectTo, похоже, возвращают только относительные ссылки или маршруты, которые я сопоставил вручную, но нет способа сказать: "Выполните 301 перенаправление на http://example.com".

Я думаю, что могу просто установить Response.StatusCode или использовать Response.Redirect, но так ли это должно быть сделано в MVC? Или существует официальный "правильный способ" перенаправления?

Обновление:. Тем временем я написал ActionResult для этого: PermanentRedirectResult

Обновление 2: Поскольку ASP.net 4.0, постоянные переадресации часть Framework.

4b9b3361

Ответ 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

Теперь я задаюсь вопросом, могу ли я обработать это более чисто с двумя маршрутами и функциями контроллера.