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

如何路由调用继承父PageModel的子PageModel方法?

问题分析与解决方案

首先明确:Razor Pages的路由机制依赖页面文件(.cshtml)与PageModel类的关联,而非单纯的类继承关系。你当前的核心问题是ChildModel没有对应的路由映射,导致AJAX请求的URL无法匹配到目标处理方法。

以下是具体实现步骤:

1. 为ChildModel创建对应Razor页面

Razor Pages必须通过.cshtml文件绑定路由,因此需要为ChildModel创建对应的页面文件:

  • 在Pages目录下创建Parent子目录,新建Child.cshtml文件
  • 页面代码只需配置路由和绑定模型,无需渲染内容:
@page "{handler?}"
@model App.Pages.Parent.ChildModel
<!-- 仅用于路由映射,无需额外HTML内容 -->

确保ChildModel的命名空间与页面路径对应(比如App.Pages.Parent),且类名与页面文件名一致(Child.cshtml对应ChildModel)。

2. 修正AJAX请求配置

调整URL与添加防伪造令牌

ASP.NET Core的POST请求默认拦截无防伪造令牌的请求,因此需要在AJAX中补充令牌,同时使用正确的路由URL:

<script>
    $.ajax({
        url: "/Parent/Child/Test",
        type: "post",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        headers: {
            "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val()
        },
        success: function(res) {
            // 处理成功逻辑
        },
        error: function(xhr) {
            // 处理错误逻辑
        }
    });
</script>

在父页面或分部页中添加防伪造令牌:

@Html.AntiForgeryToken()

3. 修正父PageModel的子模型初始化方式

你当前直接用readonly字段实例化子模型的方式不符合Razor Pages的生命周期规范,应在OnGet中初始化:

public class ParentModel : PageModel
{
    private readonly DatabaseContext _dbContext;

    public PartialPage_Add partialPage_Add { get; set; }
    public PartialPage_Delete partialPage_Delete { get; set; }

    public ParentModel(DatabaseContext dbContext) 
    {
        _dbContext = dbContext;
    }

    public IActionResult OnGet() 
    {
        partialPage_Add = new PartialPage_Add(_dbContext);
        partialPage_Delete = new PartialPage_Delete(_dbContext);
        return Page();
    }
}

4. 优化ChildModel的响应逻辑

为了适配AJAX请求,将void类型的处理方法改为返回IActionResult,便于返回JSON响应:

public class ChildModel : ParentModel
{
    public ChildModel(DatabaseContext dbContext) : base(dbContext)
    {
    }

    public IActionResult OnPostTest()
    {
        Log.Debug("Successfully called method Test() in class ChildModel");
        return new JsonResult(new { success = true, msg = "调用成功" });
    }
}

常见问题排查

  • 404错误:检查页面文件路径、@page路由指令、PageModel命名空间是否匹配
  • 400错误:确认请求头已携带防伪造令牌,或页面中已生成__RequestVerificationToken输入框
  • 无响应:检查ChildModel的处理方法是否符合命名规范(OnPost{HandlerName}格式)

内容的提问来源于stack exchange,提问作者Codingwiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:41:32