Maui Blazor 中文社区 QQ群:645660665

Blazor 使用代码直接在新窗口打开链接, 获取窗口宽度, 使用cookie

1. 在新窗口打开链接

[Inject, NotNull] IJSRuntime? JS { get; set; }

await JS.InvokeVoidAsync("eval", @"let discard = open(https://www.blazor.zone/tables/edit, _blank)");

await JS.InvokeVoidAsync("eval", $"let discard = open({url}, _blank)");

2. 直接获取窗口宽度,不用写js脚本了吧?

var innerWidth = await JS.InvokeAsync("eval", "window.innerWidth");

3. 使用cookie

原文链接: https://www.frankslowcodeblog.com/post/2023/03/23/session-variable-as-cookie-in-radzen-blazor

定义一个服务类:

using Microsoft.JSInterop;

namespace MyProject.Utils
{
    public interface ICookie
    {
        public Task SetValue(string key, string value, int? days = null);
        public Task<string> GetValue(string key, string def = "");
    }

    public class CookieService: ICookie
    {
        readonly IJSRuntime JSRuntime;
        string expires = "";

        public Cookie(IJSRuntime jsRuntime)
        {
            JSRuntime = jsRuntime;
            ExpireDays = 300;
        }

        public async Task SetValue(string key, string value, int? days = null)
        {
            var curExp = (days != null) ? (days > 0 ? DateToUTC(days.Value) : "") : expires;
            await SetCookie($"{key}={value}; expires={curExp}; path=/");
        }

        public async Task<string> GetValue(string key, string def = "")
        {
            var cValue = await GetCookie();
            if (string.IsNullOrEmpty(cValue)) return def;                

            var vals = cValue.Split(';');
            foreach (var val in vals)
                if(!string.IsNullOrEmpty(val) && val.IndexOf('=') > 0)
                    if(val.Substring(0, val.IndexOf('=')).Trim().Equals(key, StringComparison.OrdinalIgnoreCase))
                        return val.Substring(val.IndexOf('=') + 1);
            return def;
        }

        private async Task SetCookie(string value)
        {
            await JSRuntime.InvokeVoidAsync("eval", $"document.cookie = \"{value}\"");
        }

        private async Task<string> GetCookie()
        {
            return await JSRuntime.InvokeAsync<string>("eval", $"document.cookie");
        }

        public int ExpireDays
        {
            set => expires = DateToUTC(value);
        }

        private static string DateToUTC(int days) => DateTime.Now.AddDays(days).ToUniversalTime().ToString("R");
    }
}

然后在 startup.cs 中添加此服务

 services.AddScoped<ICookie, CookieService>(); 

在页面上使用

[Inject, NotNull] protected ICookie? Cookie { get; set; }

await Cookie.SetValue("mytest20", "Hello Blazor!");
_message = await Cookie.GetValue("mytest20");
posted @ 2023-06-05 05:54  AlexChow  阅读(446)  评论(0编辑  收藏  举报