Blazor 服务器端 - 有没有办法在初始化期间获取 Cookie 值?
Blazor server side - Is there any way to get a Cookie value during the initialization?
想在 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 中。
如果我在 Startup 期间无法从 cookie 中获取最后使用的语言值,当我更改为一种新语言....
所以我想要类似的东西,例如:每个页面上都有一个货币选择器,并且想将它们的值存储在 cookie 中,这样下次用户访问该页面时,它会显示正确的货币 - 没有需要重新加载页面。
欢迎任何解决方案。
你可以简单地定义一个服务,当你需要保存一个给定的货币时,你调用它的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);
}
}
}
更新:
Thank you for your answer and time. This can be a solution, however my original question was about "Would like to get a cookie value during app initialization in Startup.cs". Is it possible?
是的,这是可能的。您应该创建一个中间件,并访问 HttpContext 以读取 cookie。
注意:以下代码描述了如何在您的应用程序初始化时访问 cookie。这是最简单正确的解决方案:
将以下代码片段放在 _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 值,但经过广泛搜索后我找不到任何解决方案。 我可以从 Razor 页面获取 cookie 并了解一些存储 NuGet 包。
进一步说明:
我想要一个类似的 cookie,语言和文化模块有什么:RequestCultureProvider 可以在配置期间读取该 cookie,但它有特殊的方法,功能等。
微软官方说明:
https://docs.microsoft.com/en-us/aspnet/core/blazor/globalization-localization?view=aspnetcore-5.0
在前面的示例中,如果用户想要更改语言,调用控制器以使用关联的语言信息重新加载新页面并将该值保存在 cookie 中。
如果我在 Startup 期间无法从 cookie 中获取最后使用的语言值,当我更改为一种新语言....
所以我想要类似的东西,例如:每个页面上都有一个货币选择器,并且想将它们的值存储在 cookie 中,这样下次用户访问该页面时,它会显示正确的货币 - 没有需要重新加载页面。
欢迎任何解决方案。
你可以简单地定义一个服务,当你需要保存一个给定的货币时,你调用它的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);
}
}
}
更新:
Thank you for your answer and time. This can be a solution, however my original question was about "Would like to get a cookie value during app initialization in Startup.cs". Is it possible?
是的,这是可能的。您应该创建一个中间件,并访问 HttpContext 以读取 cookie。
注意:以下代码描述了如何在您的应用程序初始化时访问 cookie。这是最简单正确的解决方案:
将以下代码片段放在 _Host.cshtml 文件的顶部:
@{
var myCookie = HttpContext.Request.Cookies.FirstOrDefault(c => c.Key == ".AspNetCore.Cookies");
}
用cookie做任何你想做的事。如果要将值传递给 Blazor SPA,请在 App 组件中定义一个参数 属性,然后通过组件 html 标记帮助程序将 _Host.cshtml 文件中的值传递给它。
注意:上面CurrencyProvider的实现是比较合适的 为 Blazor 应用程序存储客户端数据的方式,因为 cookie 随每个请求一起发送,而本地存储保存可供 Blazor 应用程序免费使用的数据。