.NET MAUI получает ошибку при передаче данных между страницами

Я новичок в платформе .NET MAUI, и у меня есть проблема.

Когда я пытаюсь передать данные между страницами моего приложения, выдается эта ошибка: System.ArgumentException: 'unable to figure out route for: PdfViewer?pdfName=EN 10305-2 Arg_ParamName_Name'

В моем приложении я хочу открывать файлы PDF в соответствии с выбором пользователя. Например, когда пользователь нажимает первую кнопку, приложение открывает первый PDF-файл. Когда пользователь сделает то же самое для второй кнопки, откроется второй файл PDF. Сейчас все работает, кроме этого. Обычно без передачи данных приложение переходит на нужную мне страницу, но когда я пытаюсь сделать это с передачей данных, оно выдает мне эту ошибку. Я делюсь кодами страниц ниже:

(я назвал свою главную страницу «АнаСайфа»)

АнаСайфа.xaml

<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
         xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:toolkit = "http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
         x:Class = "borkatalogYeni.AnaSayfa"
         Title = "Ana Sayfa"
         BackgroundColor = "LightGray">

<Grid RowDefinitions = "Auto, Auto">
    <Entry Grid.Row = "0" Placeholder = "Ara" TextChanged = "Entry_TextChanged"></Entry>
    <CollectionView Grid.Row = "1" x:Name = "MyCollectionView" 
                    ItemsSource = "{Binding UserItems}" SelectionMode = "Single"
                    SelectedItem = "{Binding SelectedListItem}">
        <CollectionView.ItemsLayout>
            <GridItemsLayout Orientation = "Vertical" Span = "1" VerticalItemSpacing = "1"></GridItemsLayout>
        </CollectionView.ItemsLayout>
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <VerticalStackLayout VerticalOptions = "CenterAndExpand">
                    <Label Text = "{Binding Name}" TextColor = "Black" 
                       VerticalOptions = "CenterAndExpand"></Label>
                </VerticalStackLayout>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
</Grid>

АнаСайфа.xaml.cs

namespace borkatalogYeni;

public partial class AnaSayfa : ContentPage
{
public class Item
{
    public string Name { get; set; }
}

public List<Item> Items;
AnaSayfaViewModel anaSayfaViewModel;

public AnaSayfa()
{
    InitializeComponent();
    BindingContext = anaSayfaViewModel = new AnaSayfaViewModel();
}

void Entry_TextChanged(System.Object sender, Microsoft.Maui.Controls.TextChangedEventArgs e)
{
    if (string.IsNullOrWhiteSpace(e.NewTextValue))
    {
        MyCollectionView.ItemsSource = anaSayfaViewModel.UserItems;
    }
    else 
    {
        MyCollectionView.ItemsSource = anaSayfaViewModel.UserItems.Where(i => i.Name.ToLower().Contains(e.NewTextValue.ToLower()));
    }
}
}

AnaSayfaViewModel.cs (Модель представления моей главной страницы)

namespace borkatalogYeni
{
public class AnaSayfaViewModel : BindableObject
{
    public class UserItem
    {
        public string Name { get; set; }
    }

    private UserItem selectedListItem;
    public UserItem SelectedListItem
    {
        get { return selectedListItem; }
        set
        {
            if (selectedListItem != value) 
            {
                selectedListItem = value;
                OnPropertyChanged("SelectedListItem");

                if (selectedListItem != null) 
                {
                    PerformNavigation(selectedListItem.Name);
                }
            }
        }
    }

    private async void PerformNavigation(string GetName)
    {
        //I'm getting the error in here
        await Shell.Current.GoToAsync($"{nameof(PdfViewer)}?pdfName = {GetName}");
    }

    private ObservableCollection<UserItem> userItems;
    public ObservableCollection<UserItem> UserItems
    {
        get 
        {
            return userItems;
        }
        set
        {
            if (userItems != value) 
            {
                userItems = value;
                OnPropertyChanged("UserItems");
            }
        }
    }

    public AnaSayfaViewModel() 
    {
        UserItems = new ObservableCollection<UserItem>
        {
            new UserItem{Name = "EN 10305-2"},
            new UserItem{Name = "EN 10305-3"},
            new UserItem{Name = "EN 10305-5"}
        };
    }
}
}

PdfViewer.xaml (на этой странице я открываю PDF-файлы)

<?xml version = "1.0" encoding = "utf-8" ?>
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
         xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:toolkit = "http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
         x:Class = "borkatalogYeni.PdfViewer"
         Title = "PdfViewer">

<Grid>
    <WebView x:Name = "webViewPdf"
             Grid.Row = "1"
             HorizontalOptions = "Fill"
             VerticalOptions = "Fill"/>
</Grid>

PdfViewer.xaml.cs

public partial class PdfViewer : ContentPage
{
public PdfViewer(PdfViewerViewModel vm)
{
    InitializeComponent();
    BindingContext = vm;
    
    //In here, I wanted to open PDF files with the data that I tried to bring from main page
    //string pdfName = "";
    //webViewPdf.Source = pdfName + ".pdf";
    //this.Title = pdfName;
}
}

PdfViewerViewModel.cs (Просмотр модели страницы PdfViewer)

namespace borkatalogYeni
{
//After integrated view model, I tried to pass data to here but unfortunately I'm failed
[QueryProperty("pdfName", "pdfName")]
public partial class PdfViewerViewModel : ObservableObject
{
    [ObservableProperty]
    string pdfName;
}
}

попробуйте удалить пробелы из имен или закодировать их

Jason 19.07.2023 00:35

@ Джейсон Я удалил пробелы из имен, я сделал это как EN10305-2, но снова выдал ту же ошибку.

caneraltuner 19.07.2023 08:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пожалуйста, зарегистрируйте маршрут для своей страницы. Вы можете прописать маршрут в файл AppShell.xaml.cs

Основываясь на вашем коде, я создал демо и реализовал эту функцию. Вы можете обратиться к следующему коду:

AppShell.xaml.cs

public partial class AppShell : Shell 
{
    public Dictionary<string, Type> Routes { get; private set; } = new Dictionary<string, Type>();

    public AppShell()
      {
            InitializeComponent();
        RegisterRoutes();
    }

    void RegisterRoutes()
    {
        Routes.Add("pdfviewer", typeof(PdfViewer));


        foreach (var item in Routes)
        {
            Routing.RegisterRoute(item.Key, item.Value);
        }
    }
}

PfViewer.xaml.cs

[QueryProperty("pdfName", "pdfName")] 
public partial class PdfViewer : ContentPage
{
    public string pdfName
    {
        set
        {
            LoadData(value);
        }
    }

    private void LoadData(string value)
    {
        System.Diagnostics.Debug.WriteLine("---> received data is: "+value);

        try
        {
            BindingContext =  new PdfViewerViewModel(value);

            this.Title = value;

        }
        catch (Exception)
        {
            Console.WriteLine("Failed to load data.");
        }
    }

    public PdfViewer()
      {
            InitializeComponent();

      //  BindingContext = vm;

        //In here, I wanted to open PDF files with the data that I tried to bring from main page
        //string pdfName = "";
        //webViewPdf.Source = pdfName + ".pdf";
        //this.Title = pdfName;
    }
}

PdfViewerViewModel.cs

public partial class PdfViewerViewModel: ObservableObject 
{
    [ObservableProperty]
    string pdfName;

    public PdfViewerViewModel(string name) { 
       this.pdfName = name;
    }
}

В AnaSayfaViewModel.cs измените метод PerformNavigation следующим образом:

    private async void PerformNavigation(string GetName) 
    {

        await Shell.Current.GoToAsync($"pdfviewer?pdfName = {GetName}");

    }

Другие вопросы по теме