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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:57:04