ASP.NET Core 2.2 Razor Pages路由与模型绑定异常咨询
解决ASP.NET Core Razor Pages中查询字符串绑定异常的问题
兄弟,你这个问题的根源其实很明显——查询字符串的格式不符合HTTP规范!
看你给出的简化版URL:
https://localhost:5001/Test?SampleId=14&Startdate=2020-01-01&Enddate=2020-02-01?culture=de
注意最后那个?culture=de,一个合法的URL里只能有一个?用来分隔路径和查询参数,后续的所有参数都必须用&来连接。你这里用了第二个?,服务器直接把?culture=de当成了Enddate值的一部分,自然就绑定出了2020-02-01?culture=de这种奇怪的结果。
最根本的解决方案:修正URL格式
把第二个?改成&,正确的URL应该是这样:
https://localhost:5001/Test?SampleId=14&Startdate=2020-01-01&Enddate=2020-02-01&culture=de
改完之后,你的原始模型绑定代码完全不需要修改,Enddate就能自动绑定成正确的2020-02-01。
如果无法修改URL(比如遗留系统限制):优雅的替代方案
如果实在没办法调整前端生成的URL,那可以用以下几种方式处理,比直接string.Replace()更可控:
1. 在属性Setter中做截断处理
给Enddate属性加一个自定义的setter,自动识别并截断无效的后缀:
private DateTime _enddate; [BindProperty(SupportsGet = true)] public DateTime Enddate { get => _enddate; set { var valueString = value.ToString(); var questionMarkIndex = valueString.IndexOf('?'); if (questionMarkIndex > -1) { // 尝试解析截断后的字符串 if (DateTime.TryParse(valueString.Substring(0, questionMarkIndex), out var validDate)) { _enddate = validDate; return; } } // 没有无效后缀或者解析失败,用原始值 _enddate = value; } }
2. 在OnGetAsync中手动解析原始值
直接从ModelState里获取未经过绑定的原始字符串,再手动处理:
public async Task<IActionResult> OnGetAsync() { var datestart = Startdate; DateTime dateend; // 从ModelState获取Enddate的原始提交值 if (ModelState.TryGetValue("Enddate", out var enddateEntry) && DateTime.TryParse(enddateEntry.RawValue.ToString().Split('?')[0], out dateend)) { // 这里的dateend就是正确的日期了 } else { // 处理解析失败的情况 dateend = DateTime.MinValue; } // ...后续逻辑 }
关于路由模板无效的说明
你尝试的@page "{SampleId:int}/{Startdate:datetime}/{Enddate:datetime}"之所以没用,是因为这个模板是针对URL路径参数的(比如/Test/14/2020-01-01/2020-02-01这种格式),而你用的是查询字符串参数,两者不是同一个绑定逻辑,所以自然不会生效。
内容的提问来源于stack exchange,提问作者DrNice
相关产品推荐
相关产品推荐

