Asp.net Core TempData生存期和搜索词

xu3bshqb  于 2023-08-08  发布在  .NET
关注(0)|答案(2)|浏览(111)

在我的索引中,我添加了一个搜索字段。
当用户输入搜索词并单击过滤器时,将过滤索引(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如何工作(直到重读或一个上瘾的请求)?
e4eetjau

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

w1e3prcc

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。

相关问题