Xamarin Forms动态传递URL时抛出Uri无效参数异常求助
解决Xamarin动态拼接Uri时的ArgumentException问题
问题分析
静态URL运行正常,但从Preferences读取语言值拼接成查询字符串后抛出System.ArgumentException(提示Uri值无效),核心原因集中在两点:
- 从
Preferences取出的语言值包含未编码的特殊字符(如非ASCII字符、空格、&等),Uri对这类字符有严格格式要求 - 拼接后的URL存在格式错误(比如重复的
?/&,或参数值为空)
解决方案
1. 对语言参数值进行URL编码
Uri的查询参数值必须经过URL编码,避免特殊字符破坏Uri结构。使用Uri.EscapeDataString()方法处理取出的语言值:
// 读取语言设置,设置合理默认值 string lang = Preferences.Get("SelectedLanguage", "en"); // 对语言值进行URL编码,适配Uri规范 string encodedLang = Uri.EscapeDataString(lang); // 方式1:直接拼接(注意原URL已有查询参数,用&连接新参数) string validUrl = $"{_getCategories}&lang={encodedLang}"; // 方式2:用UriBuilder构造,自动处理格式问题,更安全 UriBuilder uriBuilder = new UriBuilder(_getCategories); string existingQuery = uriBuilder.Query.TrimStart('?'); string newQuery = string.IsNullOrEmpty(existingQuery) ? $"lang={encodedLang}" : $"{existingQuery}&lang={encodedLang}"; uriBuilder.Query = newQuery; // 最终得到合法Uri Uri finalUri = uriBuilder.Uri;
2. 排查Preferences中的语言值
- 调试时打印
Preferences.Get("SelectedLanguage", "")的返回值,确认是否为空、包含空格或乱码字符 - 检查保存语言值的代码,确保存入的是规范语言代码(如
zh-CN、en-US),无多余符号或空格
3. 验证最终Uri格式
拼接完成后打印最终URL字符串,确认:
- 没有重复的
?(原URL已有?,新参数必须用&连接) - 参数值无未编码的特殊字符
内容的提问来源于stack exchange,提问作者Kshitij Jhangra
相关产品推荐
相关产品推荐

