如何让属性修改仅作用于当前浏览器会话,不同步至其他会话?
问题原因与解决方案
问题根源
你遇到的跨浏览器同步问题,核心是静态成员的全局共享特性:TestingClass中的Name是static属性,它属于类本身而非类的实例。在ASP.NET应用中,静态成员会被整个应用域内的所有请求共享——不管是哪个浏览器的会话,访问的都是同一个Name值,所以Chrome修改后,Firefox刷新会直接读取到更新后的全局值。
解决步骤
1. 修正类的属性设计
移除Name的static修饰符,将其改为实例属性,让每个类实例拥有独立的Name值:
namespace ScopedTest.Data { public class TestingClass { public string? Name { get; set; } = "HAHA"; } }
2. 确保服务注册为Scoped生命周期
在Program.cs中,将TestingClass注册为Scoped服务,这样每个用户会话(请求上下文)会获得一个独立的类实例:
builder.Services.AddScoped<TestingClass>();
Scoped生命周期保证了不同浏览器会话之间的实例完全隔离,数据不会交叉共享。
3. 调整页面绑定逻辑
页面中需要绑定注入实例的Name属性,而非类本身,修正后的页面代码如下:
@using ScopedTest.Data @inject TestingClass TestInstance <PageTitle>Counter</PageTitle> <h1>Counter</h1> <input type="text" @bind-value=@TestInstance.Name /> <p>@TestInstance.Name</p>
此时每个浏览器会话操作的都是自己专属实例的Name值,跨浏览器同步的问题就会消失。
内容的提问来源于stack exchange,提问作者Am Ma
相关产品推荐
相关产品推荐

