2013-02-14 11 views

Odpowiedz

19

prosto z source

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. 

using System.Diagnostics.CodeAnalysis; 
using System.Web.Mvc.Properties; 

namespace System.Web.Mvc 
{ 
    // represents a result that performs a redirection given some URI 
    public class RedirectResult : ActionResult 
    { 
     [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "0#", Justification = "Response.Redirect() takes its URI as a string parameter.")] 
     public RedirectResult(string url) 
      : this(url, permanent: false) 
     { 
     } 

     [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "0#", Justification = "Response.Redirect() takes its URI as a string parameter.")] 
     public RedirectResult(string url, bool permanent) 
     { 
      if (String.IsNullOrEmpty(url)) 
      { 
       throw new ArgumentException(MvcResources.Common_NullOrEmpty, "url"); 
      } 

      Permanent = permanent; 
      Url = url; 
     } 

     public bool Permanent { get; private set; } 

     [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Response.Redirect() takes its URI as a string parameter.")] 
     public string Url { get; private set; } 

     public override void ExecuteResult(ControllerContext context) 
     { 
      if (context == null) 
      { 
       throw new ArgumentNullException("context"); 
      } 
      if (context.IsChildAction) 
      { 
       throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction); 
      } 

      string destinationUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext); 
      context.Controller.TempData.Keep(); 

      if (Permanent) 
      { 
       context.HttpContext.Response.RedirectPermanent(destinationUrl, endResponse: false); 
      } 
      else 
      { 
       context.HttpContext.Response.Redirect(destinationUrl, endResponse: false); 
      } 
     } 
    } 
} 

Drugi argument określa czy response is a 302 (temporary) or 301 permanent redirection. Domyślnie jest to false.

Druga metoda jest na Controller i jest po prostu wygodną metodą. Ta metoda była już dostępna w wielu wersjach MVC (już od co najmniej 2), ale IIRC, dodanie części stałej do RedirectResult wydaje mi się, że znalazłem się w MVC 4 (nie pamiętam, że widziałem to w MVC 3).

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. 

using System.Diagnostics.CodeAnalysis; 
using System.Globalization; 
using System.IO; 
using System.Security.Principal; 
using System.Text; 
using System.Web.Mvc.Async; 
using System.Web.Mvc.Properties; 
using System.Web.Profile; 
using System.Web.Routing; 
namespace System.Web.Mvc 
{ 
    [SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling", Justification = "Class complexity dictated by public surface area")] 
    public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IAsyncManagerContainer 
    { 
     // omitted for brevity 

     [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "0#", Justification = "Response.Redirect() takes its URI as a string parameter.")] 
     protected internal virtual RedirectResult Redirect(string url) 
     { 
      if (String.IsNullOrEmpty(url)) 
      { 
       throw new ArgumentException(MvcResources.Common_NullOrEmpty, "url"); 
      } 

      return new RedirectResult(url); 
     } 
    } 
} 
+1

Po prostu tak, wiesz, stałe przekierowanie dla RedirectResult _is_ w MVC 3. – MiniRagnarok

3

Robią to samo. Metoda Redirect kontrolera tworzy nowy RedirectResult. Jeśli tworzysz narzędzie RedirectResult, możesz również dodać parametr, który określa, czy przekierowanie jest trwałe (czy nie).

+0

@Curt - nie jestem tego pewien. Zakładam, że metoda przekierowania kontrolera() spowoduje tymczasowe przekierowanie - podczas gdy przeciążenia konstruktora RedirectResult() dają większą kontrolę nad stałą/tymczasową. Wydaje mi się, że metoda Redirect() kontrolera została wprowadzona, aby ułatwić sobie sprawę - nie trzeba explicity konstruować wyniku przekierowania - podobnie do metody View() kontrolerów. Więc nie sądzę, że to dziedzictwo. –

+0

+1 dzięki @ek_ny – Curt

5

this.Redirect (URL string) - Będzie wewnętrznie utworzyć nowy obiekt klasy RedirectResult i zrobić tymczasowe przekierowanie.

nowy RedirectResult (string url, bool stałe) - nastąpi przekierowanie, ale daje możliwość przekierowania na stałe lub czasowo.

Powiązane problemy