Blazor/Razor路由参数报错:无法将System.String转为System.Int32
Blazor路由参数类型转换异常解决方案
为什么Blazor不会隐式转换路由字符串为int
Blazor的路由解析逻辑和ASP.NET Core MVC并不完全一致:MVC的模型绑定系统内置了路由参数的自动类型转换逻辑,而Blazor的默认路由参数匹配仅做严格类型校验,路由值从URL解析后默认是string类型,不会自动触发隐式类型转换,直接给int类型的[Parameter]属性赋值字符串类型的路由值就会抛出类型转换异常。
调整方法
方案1:给路由模板加int类型约束(最推荐)
直接在路由模板的参数后加:int约束,明确告知Blazor路由中间件该参数需要解析为int类型即可,写法如下:
@page "/EditEmployee/{Id:int}"
无需修改你原本的参数定义:
[Parameter] public int Id { get; set; }
该方案额外优势:如果传入的参数不是合法int(比如/EditEmployee/abc),会直接触发404响应,不需要额外做参数合法性校验。
方案2:兼容特殊场景的手动转换
如果你的业务场景存在参数可能为空、或者需要自定义转换逻辑的情况,可以先把参数定义为string类型,接收后自行转换:
[Inject] public NavigationManager NavigationManager { get; set; } [Parameter] public string Id { get; set; } public int ValidId { get; set; } protected override void OnParametersSet() { if (int.TryParse(Id, out var parsedId)) { ValidId = parsedId; } else { // 非法参数处理逻辑,示例为跳转到列表页 NavigationManager.NavigateTo("/EmployeeList"); } }
可选优化:使用NavLink组件替代原生a标签
虽然本次问题和跳转标签无关,但Blazor更推荐使用内置NavLink组件做内部页面跳转,适配性更好:
<NavLink href="/EditEmployee/@Employee.EmployeeId" class="btn btn-primary m-1">Edit</NavLink>
内容的提问来源于stack exchange,提问作者PontiacGTX
相关产品推荐
相关产品推荐

