在我的索引中,我添加了一个搜索字段。
当用户输入搜索词并单击过滤器时,将过滤索引(Index)。到目前为止一切顺利。
我想实现的是,如果用户在同一个控制器中执行其他操作(编辑、详细信息、删除等)并返回到索引,我希望恢复搜索。
为此,我使用了TempData
,但没有成功。
在各种论坛/教程中,我发现关于生命的冲突。有的说:
放置在TempData中的对象的生存期正好是一个附加请求。
查看此stackoverflow article
在另一个网站上,我发现:
存储在TempData中的数据将在Cookie中保持活动状态,直到您从TempData字典中读取该数据。
查看此article
那么真相在哪里:只有一个子请求或当我读取TempData时?
我的测试说第二:“在您阅读之前”(或到期时)
这里是我在启动时的代码
public void ConfigureServices(IServiceCollection services)
{
// [..]
// Relevant code only
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromMinutes(15);
options.CookieHttpOnly = true;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// [..]
// Relevant code only
app.UseSession();
}
字符串
在我的控制器上
public async Task<IActionResult> Index(int page, string search)
{
search = search ?? TempData["Search"]?.ToString();
// Query with search data
TempData["search"] = search;
}
型
如果我在这个控制器上搜索,TempData保存搜索项。
在列表中搜索后,如果导航到其他页面,然后返回此处,则搜索词仍然存在
我已经知道存在了。Keep
,.一个或多个Peek
和用于管理TempData
的其他方法
问题
- 如何在操作之间管理搜索词?
- TempData如何工作(直到重读或一个上瘾的请求)?
2条答案
按热度按时间e4eetjau1#
从许多旧的Stack Overflow帖子和文章来看,
TempData
似乎只持续到以前版本的ASP.NET中的下一个请求。然而,根据Microsoft的说法,.NET Core的情况并非如此:NET核心公开Razor Pages
TempData
或控制器TempData
。此属性会储存数据,直到在另一个要求中读取为止。可以使用Keep(String)
和Peek(string)
方法检查数据,而无需在请求结束时删除。Keep
会将字典中的所有项目标示为保留。关于
TempData
,我经常看到的另一个说法是它是如何使用会话来实现的,但这并不是.NET Core的默认机制:默认情况下,基于Cookie的
TempData
提供程序处于启用状态。要启用基于会话的TempData
提供程序,请使用AddSessionStateTempDataProvider
扩展方法。来源:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-3.1#tempdata
w1e3prcc2#
如果在列表中搜索后,我导航到其他页面,然后返回此处,则搜索词仍然存在。
这不是它在Net Core 7中使用Razor页面和没有控制器(从我的测试中)的工作方式。在请求1/页面1中设置的TempData变量可用于下一个请求(请求2/页面2),但不可用于后续请求(无论是请求3/页面1还是请求3/页面3)。无论临时变量是否在第2页中被读取,或者它们是否在第2页中被声明为[TempData],这都适用。为了使它们在请求3中可访问,它们必须被显式读取,然后在页面2中重写。
无论使用会话还是tempdata存储cookie,这种行为似乎都是相同的。
您可以看到,如果它们仅被设计为将数据传递给下一个请求的一种方式,那么这是一种明智的故障保护。否则,如果从不读取,它们将挂起并导致意外行为,例如,当在会话中稍后访问使用这些变量的页面时。
它确实使它稍微笨重返回到一个列表页面,并显示相同的选择后,说一个更新-一个相当正常的要求。我已经尝试了会话字符串,但是a)你必须在字符串之间进行转换,b)如果你想避免上面的意外行为风险,你必须显式地清除它们。
编辑。要使TempData项在第一个请求的第一个Get之后保持不变,以便它们在后续页面中存在,唯一的方法是绑定它们并将它们隐藏在表单中。然后他们被重写到邮报上的cookie。