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。