Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪个操作重定向到当前操作?_C#_Asp.net Mvc_Asp.net Core - Fatal编程技术网

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();
    }

可能的副本适合我的用途,谢谢!