with mvc example asp.net asp.net-mvc asp.net-mvc-3 redirect actionresult

asp.net - mvc - return view c#



devolver nuevo RedirectResult() vs devolver Redirect() (3)

¿Cuál es la diferencia entre las siguientes dos declaraciones de devolución de ActionResult del controlador:

return new RedirectResult("http://www.google.com", false);

y

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


Ellos hacen la misma cosa. El método Redirect del controlador crea un nuevo RedirectResult. Si crea una instancia de RedirectResult, también tiene la capacidad de agregar un parámetro que determina si la redirección es permanente (o no).


directamente desde la 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); } } } }

El segundo argumento determina si la respuesta es una redirección permanente 302 (temporal) o 301 . Por defecto, el valor es false .

El segundo método es el Controller y es simplemente un método de conveniencia. Este método ha existido para varias versiones de MVC (desde al menos 2), pero IIRC, la adición de la parte Permanente a RedirectResult creo que ha aparecido en MVC 4 (no recuerdo haberlo visto en 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); } } }


this.Redirect (string url) : creará internamente un nuevo objeto de la clase RedirectResult y realizará una redirección temporal.

nuevo RedirectResult (string url, bool permanent) : lo redireccionará, pero le ofrece la opción de redireccionar de forma permanente o temporal.