首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >return new RedirectResult() vs return Redirect()

return new RedirectResult() vs return Redirect()
EN

Stack Overflow用户
提问于 2013-02-14 21:25:54
回答 3查看 39.3K关注 0票数 21

以下两个控制器ActionResult返回语句的区别是什么:

代码语言:javascript
复制
return new RedirectResult("http://www.google.com", false);

代码语言:javascript
复制
return Redirect("http://www.google.com");
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-14 21:32:52

直接从

代码语言:javascript
复制
// 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);
            }
        }
    }
}

第二个参数确定是否使用response is a 302 (temporary) or 301 permanent redirection。默认情况下,该值为false

第二种方法是在Controller上实现的,它是一种非常方便的方法。这种方法已经存在于MVC的许多版本中(早在2版本之前),但是IIRC,在RedirectResult中添加的永久部分,我想已经在mvc4中出现了(我不记得在mvc3中见过它)。

代码语言:javascript
复制
// 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);
      }
    }
}
票数 21
EN

Stack Overflow用户

发布于 2015-02-07 16:50:39

this.Redirect(string url) -它将在内部创建RedirectResult类的新对象并执行临时重定向。

new RedirectResult(string url,bool permanent) -它将重定向,但您可以选择是永久重定向还是临时重定向。

票数 8
EN

Stack Overflow用户

发布于 2013-02-14 21:30:10

他们做同样的事情。控制器的Redirect方法创建一个新的RedirectResult。如果您实例化了RedirectResult,您还可以添加一个参数来确定重定向是否是永久性的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14875894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档