You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在继承抽象基类的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:37:27