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

如何创建点击后跳转至其他Razor Page的按钮?

在Razor Pages中用按钮实现页面跳转/触发Post方法的解决方案

我明白你现在的困扰——锚点标签助手用得好好的,但换成按钮就要么跳不动,要么Post方法根本不触发,之前非.NET Core的写法还能用,到Razor Pages就失灵了对吧?我来给你拆解两种常见场景的解决方案,还有排查问题的关键点:


一、用按钮实现类似锚点的GET跳转(无数据提交,仅跳转)

如果只是想替代锚点的跳转功能(不需要提交数据,只是跳转到目标页面),有两种简单的实现方式:

方式1:用Form+Submit按钮(纯HTML/Razor标签助手)

这种方式和锚点的GET请求逻辑一致,只是用按钮触发:

<!-- 跳转到指定页面,可传递路由参数 -->
<form asp-page="/Reports/Edit" method="get">
    <!-- 传递ID参数,对应目标页面的路由参数 -->
    <input type="hidden" asp-route-id="123" />
    <button type="submit" class="btn btn-primary">编辑报告</button>
</form>

注意:method="get"是关键,这样点击按钮会发起GET请求,和锚点的行为完全一致。

方式2:用JavaScript直接跳转(更简洁)

如果不想写Form,直接给按钮加点击事件跳转:

<button type="button" onclick="window.location.href='@Url.Page("/Reports/Edit", new { id = 123 })'" class="btn btn-primary">编辑报告</button>

这种方式不需要依赖Form,直接通过JS修改页面地址,适合简单的跳转场景。


二、触发Post方法后跳转(需要先处理数据再跳转)

如果你需要点击按钮后先执行服务器端的Post逻辑(比如保存数据),再跳转到目标页面,但OnPostEditReport方法从未被调用,大概率是以下几个细节没做好,给你正确的示例和排查点:

正确的代码示例

页面(.cshtml)部分:

<!-- 注意method="post",指定handler为EditReport -->
<form method="post" asp-page-handler="EditReport">
    <!-- 传递需要的参数,比如报告ID -->
    <input type="hidden" name="reportId" value="123" />
    <!-- 必须添加防跨站令牌,Razor Pages默认会拦截无令牌的Post请求 -->
    @Html.AntiForgeryToken()
    <button type="submit" class="btn btn-primary">提交并编辑报告</button>
</form>

页面模型(.cshtml.cs)部分:

public class YourPageModel : PageModel
{
    // 方法名必须是OnPost[HandlerName]的格式,这里HandlerName是EditReport
    public async Task<IActionResult> OnPostEditReport(int reportId)
    {
        // 这里写你的Post逻辑,比如验证数据、保存到数据库等
        // ...

        // 逻辑完成后跳转到目标页面
        return RedirectToPage("/Reports/Edit", new { id = reportId });
    }
}

排查Post方法不触发的常见坑

  1. 按钮类型不对:如果按钮的type="button",Form不会自动提交,必须用type="submit"(默认是submit,除非手动修改)。
  2. Handler名称不匹配:OnPostEditReport对应的handler名称是EditReport,所以asp-page-handler="EditReport"不能写错大小写或者拼写。
  3. 缺少防跨站令牌:Razor Pages会默认拦截没有AntiForgeryToken的Post请求,所以必须确保Form里有@Html.AntiForgeryToken(),或者给Form加上asp-antiforgery="true"。
  4. Form的Method错误:如果写成method="get",会触发OnGetEditReport而不是OnPostEditReport。
  5. 参数传递失败:如果方法里有参数(比如reportId),Form里必须有对应的input或者asp-route-*参数,否则方法可能无法匹配触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:33:09