浏览器后退按钮不执行控制器方法

问题描述 投票:0回答:1

我正在 asp.net core 工作。我面临一个问题,当我通过浏览器后退按钮返回上次访问的网页时,我的控制器操作方法没有被执行。

当我们按下后退按钮时,浏览器会从缓存中获取数据。因此,如果我们想执行控制器操作方法,我们需要阻止浏览器缓存该页面。

我在谷歌上搜索了很多关于这个的信息。通过这个,我发现了很多基于ASP.NET MVC中缓存的解决方案。比如,禁用缓存。

我检查了这个网站并也尝试过。 https://learn.microsoft.com/en-us/aspnet/core/performance/caching/response?view=aspnetcore-2.2 。它不起作用。

我们正在根据 cookie 执行一些操作。所以禁用缓存,也不应该清除它。

ASP.NET Core 中是否有其他方法可以在按浏览器后退按钮时执行控制器操作方法?

提前致谢。

caching asp.net-core browser back-button
1个回答
6
投票

使用 no-cache 时应该小心,因为缓存对性能起着重要作用。

如果您想设置无缓存的特定控制器操作,您可以执行以下操作:

  1. CacheProfiles
     中配置 
    Startup.cs
services.AddMvc(options =>
{
    options.CacheProfiles.Add("Never",
        new CacheProfile()
        {
            Location = ResponseCacheLocation.None,
            NoStore = true
        });
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  1. 使用方法
[ResponseCache(CacheProfileName = "Never")]
public IActionResult Index()
{
    return View();
}    

如果您坚持对所有请求使用无缓存,请尝试中间件。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        context.Response.OnStarting(() =>
        {
            if (context.Response.Headers.ContainsKey("Cache-Control"))
            {
                context.Response.Headers["Cache-Control"] = "no-cache,no-store";
            }
            else
            {
                context.Response.Headers.Add("Cache-Control", "no-cache,no-store");
            }
            if (context.Response.Headers.ContainsKey("Pragma"))
            {
                context.Response.Headers["Pragma"] = "no-cache";
            }
            else
            {
                context.Response.Headers.Add("Pragma", "no-cache");
            }
            return Task.FromResult(0);
        });
        await next.Invoke();
    });
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.