Redirect和RedirectToAction之间的混淆

| 我正在研究MS证书(70-515)。 我对在网上找到的内容和在实践测试中阅读的内容感到困惑。 关于SO的一些问题指出,使用RedirectToAction正在向浏览器发送302,从而导致其在地址栏中更改其网址。 但这是来自实践测试之一的问题: 题:   MVC Home控制器当前仅具有默认的Index操作。相关代码显示在以下代码示例中。
public ActionResult Index()
{
    ViewData[\"Message\"] = \"Hello!\";
    return View();
}
  您需要创建一个名为FindID的操作,该操作显示在路径中输入的ID参数。如果路径不包含ID参数,则ASP.NET必须在不更改浏览器地址栏中URL的情况下处理Index操作,并且不得引发异常。   您应该使用哪个代码段? 正确答案:
public ActionResult FindID(int? id)
{
    if (!id.HasValue)
        return RedirectToAction(\"Index\");
    ViewData[\"Message\"] = \"ID is \" + id.ToString();
    return View();
}
说明:   您可以使用ActionResult的RedirectToAction形式来使MVC处理动作中的其他动作。 MVC放弃当前操作并处理请求,就像路由直接导致您重定向到的操作一样。从本质上讲,这等效于在标准ASP.NET应用程序中调用Server.Transfer。      重定向ActionResult向浏览器发送一个“ HTTP错误302-找到\”响应,这将导致浏览器加载指定的URL。这将更改显示在地址栏中的地址。 所以: -RedirectToAction是否使浏览器中的URL保持不变? -重定向会更改浏览器中的URL吗? -练习测试的说明正确吗?从中我了解到RedirectToAction不会执行302。     
已邀请:
           您可以使用ActionResult的RedirectToAction形式来使MVC处理动作中的其他动作。 MVC放弃当前操作并处理请求,就像路由直接导致您重定向到的操作一样。从本质上讲,这等效于在标准ASP.NET应用程序中调用Server.Transfer。 这是不正确的。 RedirectToRouteResult(RedirectToAction)和RedirectResult都执行302重定向,导致浏览器中的URL更改。 要返回Index结果而不更改url,代码实际上是:
public ActionResult FindID(int? id)
{
    if (!id.HasValue)
        return View(\"index\");
    ViewData[\"Message\"] = \"ID is \" + id.ToString();
    return View();
}
但是,我不推荐这种方法。如果我向
mysite.com/products/some-product
请求,而
some-product
不存在,则应使用相关的状态码(对于搜索引擎也很重要)通知用户。 如果FindID动作的唯一目的是对id参数进行操作,则它不应为可为空/可选。这样,如果未指定ID,则不会调用FindID操作。     
        RedirectToAction方法的文档告诉我们它确实发送了302响应:   \“向浏览器返回HTTP 302响应,这将导致浏览器向指定的动作发出GET请求。” 检查dll中的代码后发现,它确实返回了一个
RedirectToRouteResult
对象,该对象会导致重定向,因此该文档是正确的:
protected internal virtual RedirectToRouteResult RedirectToAction(string actionName, string controllerName, RouteValueDictionary routeValues) {
  RouteValueDictionary routeValueDictionaries;
  if (this.RouteData == null) {
    routeValueDictionaries = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, null, routeValues, true);
  } else {
    routeValueDictionaries = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, this.RouteData.Values, routeValues, true);
  }
  return new RedirectToRouteResult(routeValueDictionaries);
}
对测试问题的正确答案是使用不同的视图:
public ActionResult FindID(int? id) {
  if (!id.HasValue) {
    ViewData[\"Message\"] = \"Hello!\";
    return View(\"Index\");
  }
  ViewData[\"Message\"] = \"ID is \" + id.ToString();
  return View();
}
这将使用视图
Index
,而不是无参数调用
View()
返回的视图
FindID
。     

要回复问题请先登录注册