MAUI中使用RelayCommand传参时ViewModel setter接收字符串被截断
MAUI中传递带查询参数的URL被截断的问题解决办法
问题原因
Shell导航的GoToAsync方法采用类URL的查询字符串格式,其中?是查询参数的分隔标记。当直接将带?的URL拼接到导航路径时,原URL内的?会被Shell解析为新查询参数的起始符,导致auth=xxx部分被识别为独立参数,而非原URL的一部分,因此接收端只能获取到?之前的内容。
解决方案
方案1:对URL进行编码后传递
在发送端对URL做转义编码,接收端再解码还原:
发送端代码修改:
[RelayCommand] async Task Tap(string Url) { System.Diagnostics.Debug.WriteLine("Tap Sending: " + Url); var encodedUrl = Uri.EscapeDataString(Url); await Shell.Current.GoToAsync($"{nameof(ShowPage)}?Url={encodedUrl}"); }
接收端代码修改:
public string Url { set { var decodedUrl = Uri.UnescapeDataString(value); System.Diagnostics.Debug.WriteLine("ShowViewModel Recieving url: " + decodedUrl); _ = GetShows(decodedUrl); OnPropertyChanged(nameof(Shows)); } }
方案2:使用参数字典传递完整字符串
通过导航参数字典直接传递字符串,避免拼接查询字符串的解析问题:
发送端代码修改:
[RelayCommand] async Task Tap(string Url) { System.Diagnostics.Debug.WriteLine("Tap Sending: " + Url); var parameters = new Dictionary<string, object> { { "Url", Url } }; await Shell.Current.GoToAsync(nameof(ShowPage), parameters); }
此方式无需修改接收端的QueryProperty代码,Shell会直接将完整字符串赋值给对应属性。
内容的提问来源于stack exchange,提问作者James Crutchley
相关产品推荐
相关产品推荐

