Asp.net核心数据生存期和搜索条件
在我的索引中,我添加了一个搜索字段 当用户输入搜索词并单击“筛选”时,将筛选索引。 到目前为止还不错 我希望实现的是,如果用户在同一控制器中执行其他操作(编辑、详细信息、删除等)并返回索引,我希望恢复搜索 为此,我使用了Asp.net核心数据生存期和搜索条件,asp.net,session,search,asp.net-core,tempdata,Asp.net,Session,Search,Asp.net Core,Tempdata,在我的索引中,我添加了一个搜索字段 当用户输入搜索词并单击“筛选”时,将筛选索引。 到目前为止还不错 我希望实现的是,如果用户在同一控制器中执行其他操作(编辑、详细信息、删除等)并返回索引,我希望恢复搜索 为此,我使用了TempData,但没有成功 在各种论坛/教程中,我发现关于生命周期的内容相互矛盾。 有人说: 放置在TempData中的对象的生存期正好是一个额外的生命周期 请求 看到这个了吗 在另一个网站上,我发现: 存储在TempData中的数据将在cookie中处于活动状态,直到您读取它
TempData
,但没有成功
在各种论坛/教程中,我发现关于生命周期的内容相互矛盾。
有人说:
放置在TempData中的对象的生存期正好是一个额外的生命周期
请求
看到这个了吗
在另一个网站上,我发现:
存储在TempData中的数据将在cookie中处于活动状态,直到您读取它为止
从TempData字典
看到这个了吗
那么真相在哪里呢
只有一个子请求,还是在我读取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;
}
公共异步任务索引(整型页面,字符串搜索)
{
search=search??TempData[“search”]?.ToString();
//使用搜索数据进行查询
TempData[“搜索”]=搜索;
}
如果我在此控制器上搜索,TempData将保存搜索项
如果在列表中搜索后,我导航到其他页面,然后返回此处,则搜索词仍然存在
我已经知道存在。Keep
,Peek
和其他管理TempData
问题
- 如何在操作之间管理搜索词李>
- TempData是如何工作的(直到重新读取或根据一个成瘾请求)
TempData
只持续到ASP.NET早期版本中的下一个请求。但是,根据Microsoft的说法,.NET Core的情况并非如此:
ASP.NET Core公开Razor页面TempData
或控制器TempData
。此属性存储数据,直到在另一个请求中读取数据为止。Keep(String)
和Peek(String)
方法可用于检查数据,而无需在请求结束时删除<代码>保留将词典中的所有项目标记为保留
关于TempData
我反复看到的另一个说法是它是如何使用会话实现的,但这并不是.NET Core的默认机制:
默认情况下,基于cookie的TempData
提供程序处于启用状态。要启用基于会话的TempData
提供程序,请使用AddSessionStateTempDataProvider
扩展方法
资料来源:
TempData是建立在会话之上的,因此您必须注册
session
,并记住它基于cookie的本质已经知道了这些信息。