哪个操作重定向到当前操作?



是否可以检查一个动作,它是由哪个动作调用的?

听起来有点令人困惑,但我试图用一个简短的例子来解释

public IActionResult CallerAction1(){
return Redirect("CalledAction")
}
public IActionResult CallerAction2(){
return Redirect("CalledAction")
}
public IActionResult CalledAction(){
// Who called me? Who redirected to me? 1 or 2?
return View();
}

不,不是真的。重定向本身就是一种响应。它具有 301、302 或 307 状态代码和一个Location响应标头,其中包含您要"重定向"到的 URL。至此,就完成了。

然后,客户端可以选择发送针对Location标头中的 URL 的新请求,默认情况下 Web 浏览器会这样做。但是,这是一个全新的请求,与导致重定向的第一个请求完全无关。HTTP 是一种无状态协议,因此每个请求都就像客户端第一次使用服务器发出请求一样。

也就是说,请求可能附加了一个Referer(原文如此( 标头,如果是这样,则可能包含以前请求的 URL,但这是客户端实现详细信息,不能保证或可靠(它可能被欺骗(。

就像在代码中一样,你不应该关心哪个方法调用当前方法,你不应该关心哪个操作重定向到当前操作。

如果你退后一步,意识到你为什么想知道这一点,你可能想根据情况做一些不同的事情。在这种情况下,您可以使用参数。每个调用方传递一个不同的参数。

如何命名此参数取决于您希望它执行的操作。因此,例如:

public IActionResult CalledAction(bool withFullDetails){
}
public IActionResult CallerAction1(){
return RedirectToAction("CalledAction", new { withFullDetails = false });
}
public IActionResult CallerAction2(){
return RedirectToAction("CalledAction", new { withFullDetails = true });
}

您可以将操作名称或请求路径作为查询字符串传递并在CalledAction中获取它,例如

public IActionResult CallerAction1()
{
string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string requestPath = Request.Path.ToString();
return RedirectToAction("CalledAction",new { path = requestPath, name = actionName });
}
public IActionResult CalledAction()
{
var fromPath = HttpContext.Request.Query["path"].ToString();
var fromActionName= HttpContext.Request.Query["name"].ToString();
// Who called me? Who redirected to me? 1 or 2?
return View();
}

最新更新