如何在继承抽象基类的Razor页面中访问PageModel?
解决方案
1. 将Razor页面基类改为泛型实现
把NGBaseRazorPage改成泛型类,通过泛型约束限定PageModel的类型,就能在基类里强类型访问绑定的PageModel:
public abstract class NGBaseRazorPage<TModel> : Page where TModel : NGBasePageModel { protected NGBaseRazorPage() { PageId = Guid.NewGuid(); } public Guid PageId { get; } // 强类型获取绑定的PageModel,覆盖默认的dynamic Model public new TModel Model => (TModel)base.Model; // 可选:同步页面和PageModel的PageId(保持两者一致) public override async Task ExecuteAsync() { if (Model.PageId == Guid.Empty) { Model.PageId = PageId; } await base.ExecuteAsync(); } }
2. 调整PageModel基类的PageId属性
如果需要同步PageId,得给PageId加上setter(否则无法赋值同步):
public abstract class NGBasePageModel : PageModel { [BindProperty] public Guid PageId { get; set; } }
3. 让具体Razor页面继承泛型基类
比如你的SomeAwesomePage要这样继承,指定对应的PageModel类型:
@page "/some-awesome" @model SomeAwesomePageModel @inherits NGBaseRazorPage<SomeAwesomePageModel> <!-- 页面内可以直接访问基类的PageId和PageModel的PageId --> <p>页面ID: @PageId</p> <p>PageModel ID: @Model.PageId</p>
核心逻辑说明
- 泛型约束
where TModel : NGBasePageModel保证了基类能识别绑定的PageModel类型,避免了使用dynamic带来的类型不安全问题。 - 重写
ExecuteAsync是为了在页面执行流程初期同步页面和PageModel的ID,确保两者一致;如果不需要同步,直接删掉这个重写方法即可。 - 如果你的PageModel需要通过
[BindProperty]接收前端传递的PageId,必须保证PageId有setter,否则模型绑定会失败。
内容的提问来源于stack exchange,提问作者Ali NGame
相关产品推荐
相关产品推荐

