2008-10-20 4 views
17

ASP.net MVC'de, denetleyicinin 301 Yönlendirmesi'ni harici bir siteye geri göndermesinin "doğru" yolu nedir?Denetleyici Eyleminden 301 Yönlendirmesi Döndürme

Çeşitli RedirectTo-Function, yalnızca el ile eşleştirdiğim göreli bağlantıları veya rotaları döndürmek gibi görünüyor, ancak "301 Yönlendirmesi'ni http://example.com olarak gerçekleştir" şeklinde bir yolu yoktur.

Sadece Response.StatusCode'u ayarlayabilir veya Response.Redirect'i kullanabilirim, ancak MVC'de yapılması gereken yol bu mu? Ya da yönlendirme yapmak için resmi bir "doğru yol" var mı?

Güncelleme: PermanentRedirectResult

Güncelleme 2: ASP.net 4.0 beri Daimi yönlendirmeler part of the Framework olan arada, bunun için bir ActionResult yazdı.

cevap

1

Yönlendirmeyle ilgili hiçbir şey bilmediğiniz bir URL'ye yönlendirdiğinizden (bu bir dahili sayfa (klasik ASP.NET'i düşünün) veya bir dış kaynak olarak) konuştuğunuzdan sonra yapabileceğiniz tek şey ayarlamaktır. Durum kodunu ve kullanıcının tarayıcısını yoluna gönderin.

MVC'deki bu zincirde, kullanıcıyı Görünümlerine alma konusunda endişeleniyorsunuz, ancak bu Görünüm sizin kontrolünüzde değil ve hiç Görünümde olmayabilir. Sonuçta bu durumda elinizden gelenin en iyisini yapıyorsunuz ve bilgime göre MVC "kuralını" ihlal etmiyorsunuz.

Umarım bu yardımcı olur.

+2

Şimdi seçtiğim yaklaşım budur, Response.StatusCode'u 301'e ve Response.RedirectLocation'ı hedef URL'ye ayarlıyorum –

0

Bu yardımcı olur mu? http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx

Sadece sanal yolu, istediğiniz bir URL ile değiştirmeniz gerekir gibi görünüyor.

+0

Bu yaklaşımla ilgili bir sorun var: Rotayı rotalarıma eklemem gerekiyor, ancak Denetleyici Eyleminden önce hedef URL'yi bilmediğimden, onu rota tablosuna koyamıyorum ve URL'ler bir Sadece kullanım zamanı, tabloya gereksiz yollar eklemek istemiyorum. –

1

Eski URL'leri desteklemek için yönlendirmeler yapıyorum.

Denetleyicim şunun gibi görünüyor & 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 

Şimdi iki yol ve denetleyici işleviyle daha temiz bir şekilde başa çıkabilir miyim diye merak ediyorum.

16

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

veya kontrol sistemi tarafından ActionResult tür geri döndürülmesi için kullanımı

: ASP.net 4.0 çerçevesi tarafından sağlanan

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

.