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

在.NET MAUI中如何直接传递DTO对象实现视图间导航?

解决.NET MAUI Shell导航传递完整DTO对象的问题

你遇到的问题是用错了GoToAsync的重载——第二个参数是控制导航动画的布尔值,并非用来传递业务对象的参数。下面是两种可行的实现方式:

方法一:通过导航参数字典传递DTO

跳转页面时,将DTO对象存入参数字典,再传递给GoToAsync:

var navParams = new Dictionary<string, object>
{
    { "SelectedNote", SelectedNote }
};
await Shell.Current.GoToAsync(nameof(NotePage), navParams);

在目标页面NotePage的后台代码或ViewModel中,用QueryProperty特性绑定接收这个对象:

[QueryProperty(nameof(SelectedNote), "SelectedNote")]
public NoteDTO SelectedNote { get; set; }

注意:你的NoteDTO类需要是公共POCO类,属性为公共可读写类型,Shell才能正确完成参数传递。如果类包含复杂嵌套对象,可以给类标记[Serializable]特性确保序列化正常。

方法二:利用共享服务传递对象(适合MVVM架构)

如果项目采用MVVM模式,可以创建一个简单的共享服务暂存对象:

public class NavigationDataService
{
    public NoteDTO CurrentSelectedNote { get; set; }
}

在MauiProgram.cs中注册为单例:

builder.Services.AddSingleton<NavigationDataService>();

跳转前先将对象存入服务:

var navService = ServiceProvider.GetRequiredService<NavigationDataService>();
navService.CurrentSelectedNote = SelectedNote;
await Shell.Current.GoToAsync(nameof(NotePage));

在NotePage的ViewModel中注入服务并获取对象:

public class NotePageViewModel
{
    public NoteDTO SelectedNote { get; set; }

    public NotePageViewModel(NavigationDataService navService)
    {
        SelectedNote = navService.CurrentSelectedNote;
        // 用完清空避免内存泄漏
        navService.CurrentSelectedNote = null;
    }
}

两种方法里,方法一更贴合Shell导航的原生参数传递逻辑,适合你的场景;方法二更灵活,尤其适合传递复杂对象或需要在多个页面间共享数据的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:55:22