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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:11:31