RedirectToAction正在更改URL

时间:2017-08-24 19:25:28

标签: c# asp.net-mvc

我对RedirectToAction的电话就像RedirectToActionPermanent一样。也就是说,URL正在被更改,而不是简单地显示不同的视图。

  

修改:现在我考虑一下,RedirectToAction 通常充当永久重定向。如同,这可能是正确的行为。在下面的代码中,如果ModelState有效,则会向用户提供302重定向回索引。但那么,RedirectToActionPermanent是什么意思?

重定向是针对HTTP错误的。我将Web.config设置为将错误指向HttpErrorsController中的某些操作方法。这非常有效,包括按预期显示临时重定向。 (https://localhost/ThisPageDoesntExist显示错误页面,但网址保持不变)
返回HttpStatusCodeResult或抛出HttpException都可以按预期工作。

但是,如果我尝试使用RedirectToAction临时重定向到错误操作方法,则视图仍会正常显示,但网址会更改,例如https://localhost/HttpErrors/404

HttpErrorsController.cs

private ViewResult ErrorView(HttpStatusCode httpStatusCode, string shortDesc, string longDesc)
{
    Response.StatusCode = (int)httpStatusCode;
    return View("HttpError", new HttpErrorViewModel(httpStatusCode, shortDesc, longDesc));
}
[ActionName("404")]
public ActionResult Error404()
{
    return ErrorView(HttpStatusCode.NotFound, "Not Found",
        "The requested resource could not be found.");
}
// Other identical methods for each error

ItemController.cs

public ActionResult HttpError(HttpStatusCode status)
{
    return RedirectToAction(((int)status).ToString(), "HttpErrors");
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ItemViewModel viewModel)
{
    if (!Request.IsAjaxRequest())
    {
        return HttpError(HttpStatusCode.NotAcceptable);
    }
    if (ModelState.IsValid)
    {
        db.Items.Add(pm);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return PartialView("_Create", viewModel);
}

自从编写上述内容后,我意识到我可能最好只抛出一个HttpException,这样它也会被ELMAH捕获,但我仍然对上述行为感到困惑。 / p>

1 个答案:

答案 0 :(得分:0)

RedirectToAction方法使用location标头值向浏览器发送302响应,新网址和浏览器将对此新网址发出全新的http GET请求。所以你看到的是预期的行为。

如果您不想进行重定向,但希望保持原样,请不要返回RedirectResult,根据需要返回视图结果。

RedirectToActionPermanent方法将301 Moved Permanently响应发送回客户端。当您将一个页面移动到另一个页面(杀死旧页面并创建具有不同URL的新页面)并希望客户端知道它以便他们可以在将来使用新URL时,这通常很有用。考虑谷歌搜索引擎更改指向新页面的链接并在搜索结果中显示该链接。