如何引用并修改其他Razor视图中创建的公共类Model的Title属性?
解决方案
你在单个Razor视图里定义的Model类和model实例只能在当前视图内部访问,跨视图直接调用根本行不通。要实现跨视图共享并修改这个Title属性,得按下面的方式调整:
1. 把Model类移到共享位置
别在Razor视图的@code块里定义公共类,这种类的作用域仅限当前视图编译后的程序集,其他视图根本找不到它。把Model类抽出来,放到项目里的共享类文件(比如新建Models/SharedPageModel.cs):
public class SharedPageModel { public string Title { get; set; } = string.Empty; }
2. 根据场景选状态共享方式
场景一:父子视图/组件之间传递
如果两个视图是父子嵌套关系,直接通过组件参数传递实例就行:
- 父视图(持有实例的一方):
@code { private SharedPageModel model = new SharedPageModel(); protected override void OnInitialized() { model.Title = "初始标题"; } } <!-- 把实例传给子视图 --> <ChildView SharedModel="model" />
- 子视图(接收并修改的一方):
@code { [Parameter] public SharedPageModel SharedModel { get; set; } = new(); private void UpdateTitle() { SharedModel.Title = "修改后的标题"; } } <p>当前标题:@SharedModel.Title</p> <button @onclick="UpdateTitle">修改标题</button>
场景二:全局跨页面共享
要是两个视图是完全独立的页面,就得用全局状态管理,比如Blazor的单例服务:
- 先在
Program.cs里注册全局服务:
builder.Services.AddSingleton<SharedPageModel>();
- 然后在任意视图里注入就能用:
@inject SharedPageModel GlobalModel <p>全局标题:@GlobalModel.Title</p> <button @onclick="() => GlobalModel.Title = '全局修改后的标题'">修改全局标题</button>
注意事项
- Blazor Server里用全局单例要注意线程安全,多个用户会共享同一个实例;Blazor WebAssembly里的单例是客户端独立的,每个用户各自持有一份。
内容的提问来源于stack exchange,提问作者Coder_
相关产品推荐
相关产品推荐

