【发布时间】:2021-07-04 12:33:25
【问题描述】:
我在我的 Controller 类的属性上使用 [TempData] 属性,例如:
public class FooController : Controller
{
[TempData]
public string ReturnUrl { get; set; }
....
}
并在处理 GET 请求的索引操作中设置此值:
public IActionResult Index(string returnUrl = null)
{
this.ReturnUrl = returnUrl;
// Do stuff...
return View();
}
我有第二个操作处理从第一个(索引)操作引发的 POST 请求,在这里我需要读回 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]吗?
【问题讨论】:
-
具有
[TempData]属性的控制器属性将仅由临时数据提供者分配一次值,因为为了分配属性值,提供者在访问临时数据字典时会从临时数据字典中删除该条目。这就是临时数据的工作方式。确保在 GET 和 POST 请求之间没有向您的控制器发出请求。对控制器的任何请求都将触发填充 temp 属性,从而删除条目。如果您想要更多控制权,请考虑使用memory cache。 -
@Prolog - 是的,我认为这是问题所在。在 GET/POST 之间没有对控制器的任何请求但是单步执行代码我可以看到属性 getter 在 GET 请求之后被访问,这很奇怪,因为读取属性的唯一位置是POST ...知道为什么/如何触发getter吗?
标签: asp.net asp.net-mvc asp.net-core asp.net-core-3.1 tempdata