【问题标题】:Blazor server side - Is there any way to get a Cookie value during the initialization?Blazor 服务器端 - 有没有办法在初始化期间获取 Cookie 值?
【发布时间】:2021-02-16 17:18:03
【问题描述】:

希望在 Startup.cs 中的应用程序初始化期间获取 cookie 值,但经过大量搜索后,我找不到任何解决方案。 我可以从 Razor 页面获取 cookie,并了解一些存储 NuGet 包。

澄清一点:
我想要一个类似的 cookie,语言和文化模块有什么:RequestCultureProvider 可以在配置期间读取该 cookie,但它具有特殊的方法、功能等。 微软官方说明:
https://docs.microsoft.com/en-us/aspnet/core/blazor/globalization-localization?view=aspnetcore-5.0

在前面的示例中,如果用户想要更改语言,请调用控制器以使用相关语言信息重新加载新页面并将值保存在 cookie 中。
如果在启动期间我无法从 cookie 中获取上次使用的语言值,则当我更改为新语言时,初始页面需要重新加载一次... .

所以我想要类似的东西,例如:每个页面上都有一个货币选择器,并希望将其值存储在 cookie 中,因此下次用户访问该页面时,它会显示正确的货币 - 无需页面重新加载。

欢迎任何解决方案。

【问题讨论】:

  • 您对文化选择器的引用具有误导性。
  • 我已经发布了一个新答案。
  • “当我更改为新语言时,初始页面需要重新加载一次......”为什么在渲染页面之前无法读取 cookie?
  • 很抱歉,如果文化选择器示例具有误导性。 “为什么在渲染页面之前不能读取 cookie?”我可以,但我想要一个类似于文化 cookie 的解决方案,所以我不需要在每次页面加载时读取 cookie/localStorage。我只需要应用启动过程中的信息即可。

标签: c# cookies blazor blazor-server-side


【解决方案1】:

您可以简单地定义一个服务,当您需要保存给定货币时,您可以调用其 set 方法将该值保存在本地存储中。你不需要cookie。当然,如果需要,您可以使用 cookie,但使用本地存储更简单。

现在,只要您想检索此值,您就可以调用服务的 get 方法。您可以将此服务注入应用程序的每个组件。实际上,您不应该将其注入到单个组件中,您可以调用 CurrencySelector,并嵌入到 MainLayout 组件中,以代替我之前答案代码中的 CultureSelector。无需重新加载,无需刷新,只需重新渲染 CurrencySelector 组件

您的服务可能如下所示:

public class CurrencyProvider
{
    private readonly IJSRuntime _jsRuntime;

    public CurrencyProvider (IJSRuntime jsRuntime)
    {
        _jsRuntime = jsRuntime;
    }

    public async Task<string> GetCurrencyAsync()
        => await _jsRuntime.InvokeAsync<string>("localStorage.getItem", "currencyType");

    public async Task SetCurrencyAsync(string currency)
    {
        if (currency == null)
        {
            await _jsRuntime.InvokeAsync<object>("localStorage.removeItem", "currencyType");
        }
        else
        {
            await _jsRuntime.InvokeAsync<object>("localStorage.setItem", "currencyType", currency);
        }

      
    }
}

更新:

感谢您的回答和时间。这可以是一个解决方案,但是我最初的问题是关于“希望在 Startup.cs 中的应用程序初始化期间获取 cookie 值”。有可能吗?

是的,这是可能的。您应该创建一个中间件,并访问 HttpContext 以读取 cookie。

注意:以下代码描述了在初始化应用程序时如何访问 cookie。这是最简单和正确的解决方案:

将以下代码 sn -p 放在 _Host.cshtml 文件的顶部:

@{
    var myCookie = HttpContext.Request.Cookies.FirstOrDefault(c => c.Key == ".AspNetCore.Cookies");

}

对 cookie 做任何你想做的事。如果要向 Blazor SPA 传递值,请在 App 组件中定义一个参数属性,然后通过组件 html 标记帮助程序将 _Host.cshtml 文件中的值传递给它。

注意:上面 CurrencyProvider 的实现是比较合适的 为 Blazor 应用存储客户端数据的方式,因为 cookie 随每个请求一起发送,而本地存储保存可免费用于 Blazor 应用的数据。

【讨论】:

  • 感谢您的回答和时间。这可以是一个解决方案,但是我最初的问题是关于“希望在 Startup.cs 中的应用程序初始化期间获取 cookie 值”。有可能吗?
  • 这就是我要寻找的。太简单。非常感谢您的更新!
  • @Tomato,如果它解决了您的问题,您介意将其标记为答案,以便其他人知道它很有用。
猜你喜欢
  • 2021-06-16
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多