2008-10-20 102 views
17

在ASP.net MVC返回一個301重定向,什麼是「正確」的方式有一個控制器返回一個301重定向到一個外部網站?從控制器動作

各種RedirectTo-Function似乎只返回我手動映射的相對鏈接或路由,但沒有辦法說「執行301重定向到http://example.com」。

我想我可以只設置Response.StatusCode或使用Response.Redirect,但它應該在MVC做的方式?或者有沒有官方的「正確的方式」執行重定向?

更新:在此期間,我寫爲一個ActionResult:PermanentRedirectResult

更新2:由於ASP.net 4.0,永久重定向part of the Framework

回答

1

既然你是在談論重定向到你不知道的路由任何一個URL(是內部頁(認爲經典ASP.NET),或者一些外部資源),那麼你可以做的唯一事情是設置狀態碼,併發送用戶的瀏覽器。

在這條產業鏈中的MVC你擔心讓用戶將其查看,但查看是不是你的控制之下,甚至可能不是一個視圖的。所以最終你在這種情況下做得最好,並且據我所知,並沒有打破任何MVC「規則」。

我希望有幫助。

+2

這就是我現在選擇的方法,我將Response.StatusCode設置爲301,將Response.RedirectLocation設置爲目標URL – 2008-10-21 01:00:05

0

這有幫助嗎? http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx

它看起來像你只需要通過自己的喜好的URL來代替虛擬路徑。

+0

問題與方法:看來我得給路由添加到我的路線,但因爲我不知道控制器操作前,目標地址,我不能把它的路由表,因爲URL是一個僅限時間使用,我不想在表格中添加不必要的路線。 – 2008-10-20 11:03:55

1

我執行重定向以支持傳統URL。

我的控制器看起來像這樣…

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 

現在我想如果我能有兩個途徑和控制器功能,處理起來更乾淨。

16

使用

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

或用於從控制器返回一個ActionResult類型:

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

由ASP.net 4.0框架提供。