从Controller Action返回301重定向

时间:2008-10-20 09:53:10

标签: asp.net-mvc

在ASP.net MVC上,让控制器将301重定向返回到外部站点的“正确”方法是什么?

各种RedirectTo-Function似乎只返回我手动映射的相对链接或路由,但没有办法说“执行301重定向到http://example.com”。

我想我可以设置Response.StatusCode或使用Response.Redirect,但是它应该在MVC中完成吗?或者是否有正式的“正确方式”来执行重定向?

更新:与此同时,我为此写了一个ActionResult:PermanentRedirectResult

更新2:自ASP.net 4.0起,永久重定向为part of the Framework

4 个答案:

答案 0 :(得分:19)

使用

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

或从控制器返回ActionResult类型:

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

由ASP.net 4.0框架提供。

答案 1 :(得分:1)

由于您正在谈论重定向到您不了解路由的URL(是内部页面(想想经典的ASP.NET)或某些外部资源),那么您唯一能做的就是设置状态代码,并在途中发送用户的浏览器。

在MVC的这个链中你担心让用户进入他们的View,但是View不在你的控制之下,甚至可能根本不是View。所以最终你在这种情况下做得最好,据我所知,并没有打破任何MVC“规则”。

我希望有所帮助。

答案 2 :(得分:1)

我执行重定向以支持旧版网址。

我的控制器看起来像这样...

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

我现在想知道是否可以使用两个路径和控制器功能更清晰地处理它。

答案 3 :(得分:0)

这对你有帮助吗? http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx

看起来您只需要用您喜欢的URL替换虚拟路径。