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

Razor Pages中Opponents页面重载遇404,求参数判断优化方案

解决方案

一、修复无参数访问404问题

当前404的核心原因是你的@page指令仅定义了带参数的路由,无参数的/Opponents无法匹配到该页面;同时后台OnGet方法存在缩进逻辑错误,且空参数时未加载汇总数据。

步骤1:修改页面路由为可选参数

在Opponents.cshtml中,将@page指令改为支持可选参数的形式:

@page "{Opponent?}"
@model Alpha.Pages.OpponentsModel

?标记表示Opponent参数是可选的,这样/Opponents和/Opponents/Centerville都会匹配到这个页面。

步骤2:修正后台OnGet方法逻辑

在OpponentsModel的OnGet方法中,修复缩进错误,并在无参数时加载所有对手的汇总数据:

using Alpha.Data;
using Alpha.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace Alpha.Pages {
    public class OpponentsModel : PageModel {
        private readonly AlphaContext _context;

        public IEnumerable<GameSummary> GameSummaries { get; set; }
            = Enumerable.Empty<GameSummary>();
        // 新增属性用于传递参数状态到视图
        public string CurrentOpponent { get; set; }

        public OpponentsModel(AlphaContext ctx) {
            _context = ctx;
        }
 
        public IActionResult OnGet(string opponent) {
            CurrentOpponent = opponent;
            if (string.IsNullOrEmpty(opponent)) {
                // 无参数时加载所有汇总数据(汇总页面)
                GameSummaries = _context.GameSummaries.ToList();
            } else {
                // 带参数时加载对应对手的数据(详情页面)
                GameSummaries = _context.GameSummaries.Where(s => s.Opponent == opponent).ToList();
            }
            return new PageResult();
        }
    }
}

注意:

  • 修正了原代码中else块的缩进问题(原代码中return new PageResult()不在else块内,会导致逻辑错误)
  • 新增CurrentOpponent属性,方便视图直接判断页面类型
  • 无参数时主动加载所有GameSummaries,作为汇总页面的数据

二、替换try/catch的更优判断方式

用try/catch判断参数或数据存在性既不优雅,也会带来不必要的性能损耗。可以直接通过后台传递的状态或数据集合的状态做判断:

修改Opponents.cshtml的视图逻辑:

@page "{Opponent?}"
@model Alpha.Pages.OpponentsModel

@{
    ViewData["Title"] = string.IsNullOrEmpty(Model.CurrentOpponent) ? "对手汇总" : Model.CurrentOpponent;
}

@if (string.IsNullOrEmpty(Model.CurrentOpponent)) {
    <!-- 汇总页面内容 -->
    <h1>所有对手汇总</h1>
    <!-- 这里渲染汇总数据的HTML,比如遍历Model.GameSummaries展示每个对手的信息 -->
} else {
    @if (Model.GameSummaries.Any()) {
        <!-- 详情页面内容 -->
        <h1>@Model.CurrentOpponent 对战详情</h1>
        <!-- 渲染该对手的具体对战数据 -->
    } else {
        <!-- 对手不存在的提示 -->
        <p>未找到该对手的对战记录</p>
    }
}

这种方式的优势:

  • 直接通过CurrentOpponent是否为空判断页面类型,逻辑清晰
  • 针对详情页面额外判断数据是否存在,避免First()引发的异常
  • 完全避免了异常捕获的开销,代码可读性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:24:51