使用.NET Core和Razor Pages读取GET参数时遇错误求助
问题排查与解决
先明确你代码里的几个核心误区,这是导致错误的根本原因:
错误原因分析
- Razor Pages命名空间与目录结构不匹配:
Razor Pages默认约定页面文件存放在Pages目录下,后台模型类的命名空间需遵循项目名.Pages.子目录名规则。你用了SWAT2022.Views.Home,而Views是MVC视图的专属目录,框架无法识别该命名空间下的Razor Pages模型。 - 页面类名与文件名不匹配:
Razor Pages要求后台模型类名必须是页面文件名+Model,你的页面是Survey.cshtml,但类名是Index1Model,框架无法将页面与模型关联。 - 手动读取Query参数的冗余写法:
Razor Pages支持自动模型绑定,无需直接操作Request.Query,这种写法既不规范也容易引发错误。 - 视图中属性名混淆:
你在<h2>里写的LAT:@Model.Long LONG:@Model.Lat把经纬度属性搞反了,即使参数读取成功也会显示错误值。
修正步骤
1. 调整文件结构与后台模型
- 将
Survey.cshtml和Survey.cshtml.cs移动到项目的Pages/Home目录下(无Home子目录则新建)。 - 修改
Survey.cshtml.cs代码:
using Microsoft.AspNetCore.Mvc.RazorPages; namespace SWAT2022.Pages.Home { // 类名改为SurveyModel,匹配页面文件名 public class SurveyModel : PageModel { public string? Lat { get; set; } public string? Long { get; set; } // 自动绑定Query参数,long是C#关键字,加@转义 public void OnGet(string? lat, string? @long) { Lat = lat; Long = @long; } // 另一种简洁绑定方式:用BindProperty标记属性(支持GET请求需加SupportsGet=true) // [BindProperty(SupportsGet = true)] // public string? Lat { get; set; } // [BindProperty(SupportsGet = true)] // public string? Long { get; set; } // public void OnGet() { } // 无需手动赋值,框架自动绑定Query参数 } }
2. 修正Razor视图
修改Survey.cshtml:
@page "/home/survey" <!-- 指定路由,留空则使用默认路由 --> @model SWAT2022.Pages.Home.SurveyModel <!-- 修正模型的命名空间与类名 --> @{ ViewData["Title"] = "Test"; } <h1>Hello, world!</h1> <h2>The time on the server is @DateTime.Now LAT:@Model.Lat LONG:@Model.Long </h2> <!-- 修正属性顺序 -->
3. 测试请求
启动项目后,访问类似https://localhost:xxxx/home/survey?Lat=39.9&Long=116.3的地址,即可看到正确的参数值显示。
内容的提问来源于stack exchange,提问作者robm
相关产品推荐
相关产品推荐

