使用.NET MAUI与Web API开发测验应用时获取题目失败求助
解决.NET MAUI中无法通过测验ID获取对应题目的问题
排查步骤与解决方案
1. 修正导航参数与QueryProperty的匹配问题
检查导航参数名和QueryProperty接收名称的一致性,虽然MAUI导航参数默认不区分大小写,但统一命名可避免潜在问题:
public async Task Navigation() { // 先验证测验ID是否有效 if (QuizesVM?.Id <= 0) { await Shell.Current.DisplayAlert("提示", "未选中有效的测验", "确定"); return; } // 保持参数名与QueryProperty接收名称一致 await Shell.Current.GoToAsync($"{nameof(QuizDisplay)}?QuizId={QuizesVM.Id}"); }
2. 规范属性Setter中的异步方法调用
在QuizId的setter中直接调用异步方法属于async void调用,易导致异常无法捕获或UI线程混乱,改为通过RelayCommand触发:
private int quizId; public int QuizId { get => quizId; set { // 仅当属性值变化且ID有效时触发加载 if (SetProperty(ref quizId, value) && value > 0) { GetQuizQuestionsCommand.Execute(null); } } }
3. 修复Service返回null引发的空引用异常
当API返回非成功状态码时,原代码返回null,后续遍历会触发空引用异常,改为抛出明确异常并确保返回非null集合:
public async Task<List<Question>> LoadQuizData(int quizId) { var requestUrl = $"{baseUrl}/GetQuestionsPerQuiz/{quizId}"; var response = await _httpClient.GetAsync(requestUrl); // 非成功状态直接抛出异常,暴露具体错误 response.EnsureSuccessStatusCode(); var content = await response.Content.ReadAsStringAsync(); // 反序列化失败或返回空时,返回空集合而非null return JsonConvert.DeserializeObject<List<Question>>(content) ?? new List<Question>(); }
4. 验证API端点有效性
- 直接在浏览器/Postman中调用
{baseUrl}/GetQuestionsPerQuiz/{有效QuizId},确认返回正确的JSON格式数据 - 检查
baseUrl是否包含正确的协议(http/https)和端口 - 确认Web API的
GetQuestionsPerQuiz接口正确接收quizId参数并返回预期数据
5. 添加日志辅助排查
在关键节点添加日志,定位问题根源:
// 导航方法中 Console.WriteLine($"当前选中测验ID: {QuizesVM.Id}"); // QuizDisplayViewModel的setter中 Console.WriteLine($"接收到的测验ID: {value}"); // LoadQuizData中 Console.WriteLine($"请求API地址: {requestUrl}"); Console.WriteLine($"API响应状态码: {response.StatusCode}");
总结
优先解决空引用异常和异步调用规范问题,再验证导航参数与API端点的正确性,即可解决「Unable to get Quiz Questions」错误。
内容的提问来源于stack exchange,提问作者montassar meddeb
相关产品推荐
相关产品推荐

