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的本质已经知道了这些信息。