gpt4 book ai didi

c# - TempData 只能访问一次?

转载 作者:太空宇宙 更新时间:2023-11-03 22:31:53 27 4
gpt4 key购买 nike

Mt textbook 说 TempData 一直存在直到它被读取,这意味着它会在读取后被销毁,但我确实在这样的 View 中看到了一些代码:

@if (TempData["message"] != null)
{
<div class="alert alert-success">@TempData["message"]</div>
}

所以我很困惑,这不是TempData["message"] != null吗?已经访问了 TempData,为什么在 <div> 中仍然可以访问它?

另一个问题是,假设我们有一个 XXXController,其中一个操作方法使用 TempData 作为:

[HttpPost]
public IActionResult Edit(Product product)
{
...
TempData["message"] = $"{product.Name} has been saved";
...
}

使用Xunit和Moq进行单元测试时,代码如下:

Mock<ITempDataDictionary> tempData = new Mock<ITempDataDictionary>();
XXXController target = new XXXController(mock.Object)
{
TempData = tempData.Object
}

为什么要初始化TempData,不是说controller instanced创建的时候就可以直接赋值给TempData吗?

最佳答案

Isn't that TempData["message"] != null already accessing TempData, how come it can still be accessed in the <div>?

是的,TempData["message"] != null正在访问临时数据值,因此它被标记为不会为下一个请求保留。

除非读取临时数据,否则会为下一个请求保留临时数据。然而,它不会立即被删除。因此,您可以在处理同一个请求时多次读取同一个临时数据,但它不会在下一个请求中出现。

逻辑基本上是临时数据提供者跟踪字典以及它应该为下一个请求保留哪些键。它从字典中的每个键开始,因此所有内容都将保留以供下一个请求使用。当您访问一个值时,该键将从键列表中删除以保留。当您设置一个值时,该键将被添加到要保留的键列表中。

Why do I need to initialize the TempData, isn't that when controller instanced is created, we can assign TempData immediately?

默认情况下, Controller 实际上并没有太多内容。该框架的构建方式使您实际上不需要继承 ControllerControllerBase你仍然可以创建一个完美的 Controller 。像 HttpContext 这样的访问器, ViewData , 或 TempData , 只是空槽,最终会在 ASP.NET Core 执行操作时被填充。然而,它们不会在创建过程中自动设置。

这意味着在测试中,ASP.NET Core 不会为您执行操作,您必须自己处理并设置这些插槽。因此,如果您依赖这些属性中的任何一个,则必须先创建它们,然后才能对其进行测试。

关于c# - TempData 只能访问一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57157757/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com