Атрибут Asp.Net Core TempData — значение всегда равно нулю

Я использую атрибут [TempData] для свойства моего класса контроллера, например:

public class FooController : Controller
{
    [TempData]
    public string ReturnUrl { get; set; }
  
    ....
}

И установка этого значения в действии Index, обрабатывающем запрос GET:

public IActionResult Index(string returnUrl = null)
{
    this.ReturnUrl = returnUrl;

    // Do stuff...

    return View();
}

У меня есть второе действие, обрабатывающее запрос POST, который возникает из первого действия (Index), именно здесь мне нужно прочитать значение TempData обратно:

[HttpPost]
public IActionResult HandlePost(int id)
{
    // Do post things...

    // Read value from [TempData] backed property
    string returnUrl = this.ReturnUrl;
    
    return this.Redirect(returnUrl);
}

Однако я обнаружил, что значение свойства ReturnUrl всегда равно null.

Но если я использую TempData напрямую, вот так:

// Set return url
TempData["returnUrl"] = returnUrl;

А также

// Get return url
string returnUrl = TempData["returnUrl"] as string;

Он отлично работает - я неправильно использую атрибут? Можно ли использовать [TempData] таким образом?


person DGibbs    schedule 08.04.2021    source источник
comment
Свойство контроллера с атрибутом [TempData] будет иметь значение, назначенное поставщиком временных данных только один раз, поскольку для присвоения значения свойства поставщик удаляет запись из словаря временных данных при доступе к нему. Вот как работают временные данные. Убедитесь, что между запросами GET и POST к вашему контроллеру не поступают запросы. Любой запрос к вашему контроллеру приведет к заполнению свойства temp, что приведет к удалению записи. Если вам нужен больший контроль, рассмотрите возможность использования кэш памяти.   -  person Prolog    schedule 08.04.2021
comment
@Prolog - да, я думаю, что это проблема. Между GET/POST нет никаких запросов к контроллеру, однако, пройдясь по коду, я вижу, что доступ к получателю свойства осуществляется сразу после запроса GET, что странно, потому что единственное место, где свойство читается, находится внутри POST... есть идеи, почему/как будет запущен геттер?   -  person DGibbs    schedule 12.04.2021


Ответы (1)


Я могу получить returnUrl с помощью this.ReturnUrl, вот демо:

Контроллер:

public class Test1Controller : Controller
    {
        [TempData]
        public string ReturnUrl { get; set; }
        public IActionResult Index(string returnUrl)
        {
            this.ReturnUrl = returnUrl;
            return View();
        }
        [HttpPost]
        public IActionResult HandlePost()
        {
            string returnUrl = this.ReturnUrl;
            return Ok();
        }
    }

Индекс.cshtml:

<form method="post" asp-action="HandlePost">
    <input type="submit" value="submit"/>
</form>

URL:

https://localhost:44355/Test1?returnUrl=ssss

результат: введите здесь описание изображения

person Yiyi You    schedule 09.04.2021