在.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
相关产品推荐
相关产品推荐

