为什么要使用RedirectToAction?

4

这两者之间有什么区别:

public ActionResult logOff()
{
    FormsAuth.SignOut();
    return RedirectToAction("index", "Home");
}

并且:

public ActionResult logOff()
{
    FormsAuth.SignOut();
    return index();
}
2个回答

8

是的。

使用RedirectToAction(),您的用户将被重定向到Index页面(这是他们在浏览器地址栏上看到的)。而仅返回index()方法的结果将填充当前页面(LogOff?)与其他页面的内容。

在这种情况下,也许没有区别,但如果您的操作执行了一些逻辑,则当用户简单地刷新页面时可能会出现问题。


Adriano,第二个选项就像是返回View("index")一样吗? - Rodrigo Manguinho
@RodrigoManguinho 是的,就是这样。View() 返回另一个操作的结果。RedirectXYZ() 执行 HTTP 重定向(请参见 archil 的帖子)。 - Adriano Repetti
我没有足够强调“结果”(你跳过了方法内部的逻辑问题,但仍然欺骗了浏览器)。再次强调,这是否是一个问题取决于你正在做什么,但即使比重定向快一点,我也不认为这是一个常见的问题(并且你将保持代码路径清晰明了)。 - Adriano Repetti

1

请查看Post/Redirect/Get模式

当Web表单通过HTTP POST请求提交到服务器时,在某些用户代理中尝试刷新服务器响应的Web用户可能会导致重新提交原始HTTP POST请求的内容,可能会导致不希望出现的结果,例如重复的Web购买。为了避免这个问题,许多Web开发人员使用PRG模式1 - 代替直接返回Web页面,POST操作返回重定向命令。 HTTP 1.1规范引入了HTTP 303响应代码,以确保在这种情况下,Web用户的浏览器可以安全地刷新服务器响应,而不会导致重新提交初始HTTP POST请求。然而,今天大多数常见的商业应用程序(新旧应用程序)仍然继续在这些情况下发出HTTP 302响应。通常避免使用HTTP 301,因为符合HTTP-1.1标准的浏览器不会在收到HTTP 301后将方法转换为GET,而对于HTTP 302,这样做更为常见[2]。但是,在不希望将POST参数转换为GET参数并因此记录在日志中的情况下,可能会优先使用HTTP 301。 PRG模式无法解决每种重复表单提交的情况。 PRG无法解决的一些已知重复表单提交包括:如果Web用户在初始提交由于服务器延迟而完成之前刷新,则在某些用户代理中会导致重复的HTTP POST请求。

这是在ASP.NET MVC中使用HTTP Posts时常见的重定向模式之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接