Какое действие перенаправлено на текущее действие? - PullRequest
0 голосов
/ 25 сентября 2019

Можно ли в действии проверить, каким действием оно было вызвано?

Звучит немного запутанно, но я пытаюсь объяснить в коротком примере

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

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Нет, не совсем.Перенаправление - это ответ сам по себе.Он имеет код состояния 301, 302 или 307 и заголовок ответа Location, который содержит URL, на который вы «перенаправляете».На этом этапе все готово.

Затем клиент может выбрать отправку нового запроса на URL-адрес, который был в заголовке Location, и веб-браузеры делают по умолчанию.Однако это совершенно новый запрос, совершенно не связанный с первым, приведшим к перенаправлению.HTTP - это протокол без сохранения состояния, поэтому каждый запрос выглядит так, как будто это первый запрос, который клиент когда-либо сделал с сервером.

Тем не менее, может быть Referer (sic)заголовок, прикрепленный к запросу, и, если это так, этот может содержать URL-адрес, который был запрошен ранее, но это детали реализации клиента, а не гарантированные или ненадежные (это может быть подделано).

0 голосов
/ 26 сентября 2019

Вы можете передать имя действия или путь запроса в виде строки запроса и получить его в 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();
    }
0 голосов
/ 25 сентября 2019

Как и в коде, где вам не важно, какой метод вызвал текущий метод, вам не важно, какое действие перенаправлено на текущее действие.

Если вы сделаете шаг назад и поймете почему вы хотите это знать, вы, вероятно, хотите сделать что-то другое в зависимости от обстоятельств.В этом случае вы используете параметры.И каждый вызывающий абонент передает свой параметр.

Как назвать этот параметр, зависит от того, что вы хотите, чтобы он делал.Так, например:

public IActionResult CalledAction(bool withFullDetails){
}

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

public IActionResult CallerAction2(){
    return RedirectToAction("CalledAction", new { withFullDetails = true });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...