C# 哪个操作重定向到当前操作?
是否可以签入操作,该操作由哪个操作调用 听起来有点混乱,但我试着用一个简短的例子来解释C# 哪个操作重定向到当前操作?,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,是否可以签入操作,该操作由哪个操作调用 听起来有点混乱,但我试着用一个简短的例子来解释 public IActionResult CallerAction1(){ return Redirect("CalledAction") } public IActionResult CallerAction2(){ return Redirect("CalledAction") } public IActionResult CalledAction(){ // Who call
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。在这一点上,它完成了
然后,客户端可以选择发送一个新的URL请求,该URL位于位置
标题中,默认情况下web浏览器会这样做。然而,这是一个全新的请求,与导致重定向的第一个请求完全无关。HTTP是一种无状态协议,因此每个请求就像是客户端对服务器发出的第一个请求一样
也就是说,可能有一个
Referer
(sic)头附加到请求,如果是这样,这可能包含以前请求的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();
}
可能的副本适合我的用途,谢谢!