C# RedirectToAction正在更改URL

C# RedirectToAction正在更改URL,c#,asp.net-mvc,C#,Asp.net Mvc,我对RedirectToAction的调用就像RedirectToActionPermanent一样。也就是说,URL正在更改,而不是简单地显示不同的视图 编辑:现在我想起来了,重定向到操作通常充当永久重定向。如中所示,这可能是正确的行为。在下面的代码中,如果ModelState有效,则向用户提供返回索引的302重定向。但是,重定向到ActionPermanent有什么意义呢 重定向用于HTTP错误。我已将Web.config设置为将错误指向HttpErrorsController中的某些操作方

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

编辑:现在我想起来了,
重定向到操作
通常充当永久重定向。如中所示,这可能是正确的行为。在下面的代码中,如果
ModelState
有效,则向用户提供返回索引的302重定向。但是,
重定向到ActionPermanent
有什么意义呢

重定向用于HTTP错误。我已将Web.config设置为将错误指向
HttpErrorsController
中的某些操作方法。这非常有效,包括如预期的那样显示临时重定向。(
https://localhost/ThisPageDoesntExist
显示错误页面,但URL保持不变)
返回
HttpStatusCodeResult
或抛出
HttpException
这两种方法都能正常工作

但是,如果我尝试使用
redirectoaction
临时重定向到错误操作方法,视图仍会正确显示,但URL会更改,例如
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
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);
}
ItemController.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
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捕获,但是我仍然对上面描述的行为感到非常困惑。

RedirectToAction方法使用
位置
头值将302响应发送回浏览器,新url和浏览器将对该新url发出一个全新的http GET请求。所以你看到的是预期的行为

如果您不想执行重定向,但想保持url不变,请不要返回重定向结果,根据需要返回视图结果


RedirectToActionPermanent
方法将301永久移动响应发送回客户端。当您将站点的一个页面移动到另一个页面(删除一个旧页面并创建一个具有不同url的新页面)并且希望客户端知道该页面时,这通常非常有用,以便他们可以调用调用代码以在将来使用新url。考虑一下google搜索引擎更改到新页面的链接,并在搜索结果中显示该链接。

重定向操作方法将302响应发送回浏览器,其中包含
位置
头值,新url和浏览器将对该新url发出全新的http GET请求。所以你看到的是预期的行为

如果您不想执行重定向,但想保持url不变,请不要返回重定向结果,根据需要返回视图结果


RedirectToActionPermanent
方法将301永久移动响应发送回客户端。当您将站点的一个页面移动到另一个页面(删除一个旧页面并创建一个具有不同url的新页面)并且希望客户端知道该页面时,这通常非常有用,以便他们可以调用调用代码以在将来使用新url。想想谷歌搜索引擎改变你新页面的链接并在搜索结果中显示出来。

是的,我在发布后意识到,
RedirectToAction
总是这样做。关于这一点,请参阅我的编辑。至于直接返回视图,我考虑过了,但我不知道如何从另一个控制器调用该操作方法。并且在
ItemController
中返回
视图(“HttpError”)
右侧将违背这一点。您可以使用自定义错误处理程序属性(继承自处理错误的
HandleErrorAttribute
,在
OnException
方法中,您可以返回任何您想要的响应。据我所知,您仍然需要自己指定视图。是的。您可以指定要发送的结果。它可以是任何内容,视图结果,重定向结果等等要做到这一点并保留当前的
HttpErrorsController
,唯一的方法是返回一个
新的HttpErrorsController()。错误[此处的状态代码]()
,这是…janky。是的,我在发布后意识到,
重定向到操作
总是这样。关于这一点,请参阅我的编辑。至于直接返回视图,我考虑过,但我不知道如何从另一个控制器调用该操作方法。并返回
视图(“HttpError”)
ItemController
中的右侧将忽略该点。您可以使用自定义错误处理程序属性(继承自处理错误的
HandleErrorAttribute
,在
OnException
方法中,您可以返回任何您想要的响应。据我所知,您仍然需要自己指定视图。是的。您可以指定要发送的结果。它可以是任何内容,视图结果,重定向结果等等要做到这一点并保留当前的
HttpErrorsController
,唯一的方法是返回一个
new-HttpErrorsController().Error[status code here]()
,即…janky。