Возврат перенаправления 301 из действия контроллера - PullRequest
19 голосов
/ 20 октября 2008

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

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

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

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

Обновление 2: Начиная с ASP.net 4.0, постоянные перенаправления являются частью платформы .

Ответы [ 4 ]

19 голосов
/ 13 июля 2012

Используйте

Response.RedirectPermanent("http://www.google.com"); 

или для возврата типа ActionResult из контроллера:

return RedirectPermanent("http://www.google.com"); 

предоставлено платформой ASP.net 4.0.

1 голос
/ 21 октября 2008

Поскольку вы говорите о перенаправлении на URL-адрес, который ничего не знает о маршрутизации (будь то внутренняя страница (например, классический ASP.NET) или какой-либо внешний ресурс), то единственное, что вы можете сделать, это установить код состояния и отправьте браузер пользователя на своем пути.

В этой цепочке в MVC вы беспокоитесь о том, чтобы заставить пользователя просматривать его View, но этот View не находится под вашим контролем и может даже не быть View. Так что, в конечном счете, вы делаете все возможное, что можете в данных обстоятельствах, и, насколько мне известно, не нарушаете никакого «правила» MVC.

Надеюсь, это поможет.

1 голос
/ 07 мая 2009

Я выполняю перенаправления для поддержки устаревших 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

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

0 голосов
/ 20 октября 2008

Помогает ли это кому-нибудь? http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx

Похоже, вам просто нужно заменить виртуальный путь на URL, который вам нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...