2008-10-20 4 views
17

На ASP.net MVC, что такое «правильный» способ заставить контроллер вернуть 301 перенаправление на внешний сайт?Возврат перенаправления 301 от действия контроллера

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

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

Update: В то же время, я написал ActionResult для этого: PermanentRedirectResult

Update 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 перед действием Controller, я не могу поместить его в таблицу маршрутов, и поскольку URL-адреса являются одним из время использования, я не хочу добавлять лишние маршруты в таблицу. – 2008-10-20 11:03:55

1

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

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

16

Применение

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

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

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

предусмотрено 4.0 рамках ASP.net.

Смежные вопросы