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

.NET MAUI页面间传参报错:无法解析路由问题求助

.NET MAUI Shell导航传参报错:System.ArgumentException: unable to figure out route for: PdfViewer?pdfName=EN 10305-2

问题原因

错误核心是导航参数包含空格,未进行URL编码。Shell导航的URL遵循标准URL规则,空格属于非法字符,直接拼接会导致路由解析器无法正确识别参数,进而抛出路由找不到的异常。

解决步骤

1. 对导航参数进行URL编码

修改AnaSayfaViewModel中的PerformNavigation方法,使用Uri.EscapeDataString对包含空格的参数进行编码:

private async void PerformNavigation(string GetName)
{
    // 对参数进行URL编码,处理空格等特殊字符
    var encodedPdfName = Uri.EscapeDataString(GetName);
    await Shell.Current.GoToAsync($"{nameof(PdfViewer)}?pdfName={encodedPdfName}");
}

2. 确保参数正确接收并触发PDF加载逻辑

你的PdfViewerViewModel已使用[QueryProperty]标记,可利用CommunityToolkit.Mvvm的ObservableProperty特性添加部分方法,响应属性变化:

namespace borkatalogYeni
{
    [QueryProperty(nameof(PdfName), "pdfName")]
    public partial class PdfViewerViewModel : ObservableObject
    {
        [ObservableProperty]
        string pdfName;

        // 当PdfName属性变化时自动调用此方法
        partial void OnPdfNameChanged(string value)
        {
            // 此处可添加PDF加载逻辑,例如通知View加载对应文件
        }
    }
}

3. 在PdfViewer页面中响应参数变化

在PdfViewer.xaml.cs中监听ViewModel的属性变化,实现PDF加载:

public partial class PdfViewer : ContentPage
{
    private readonly PdfViewerViewModel _viewModel;

    public PdfViewer(PdfViewerViewModel vm)
    {
        InitializeComponent();
        BindingContext = _viewModel = vm;
        
        // 监听PdfName属性变化,加载PDF
        _viewModel.PropertyChanged += ViewModel_PropertyChanged;
    }

    private void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == nameof(PdfViewerViewModel.PdfName) && !string.IsNullOrEmpty(_viewModel.PdfName))
        {
            webViewPdf.Source = $"{_viewModel.PdfName}.pdf";
            this.Title = _viewModel.PdfName;
        }
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        // 取消事件订阅,避免内存泄漏
        _viewModel.PropertyChanged -= ViewModel_PropertyChanged;
    }
}

额外检查

确保PdfViewer页面已在Shell中正确注册路由(你提到不传参可正常跳转,此步骤大概率已完成):

  • 在AppShell.xaml中添加:
    <ShellContent Route="PdfViewer" ContentTemplate="{DataTemplate local:PdfViewer}" />
    
  • 或在代码中注册:
    Routing.RegisterRoute(nameof(PdfViewer), typeof(PdfViewer));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:37:04