使用RestSharp将API数据返回至View时遇类型不匹配异常求助
解决ASP.NET MVC中RestSharp调用API的模型类型不匹配异常
错误核心原因
当前存在三个关键问题导致类型不匹配异常:
- 异步方法未正确等待:控制器调用异步方法时未用
await,传递给视图的是Task<ProductViewModel>对象,而非实际产品数据 - API响应反序列化错误:API返回包含产品数组的
RootViewModel结构,但代码错误地反序列化为单个ProductViewModel - 返回类型与视图期望不匹配:视图需要
IEnumerable<ProductViewModel>类型模型,但客户端方法返回单个对象,控制器也未正确传递产品集合
分步修复代码
1. 修正WebProductClient的GetAllProduct方法
调整返回类型并正确反序列化API响应:
public class WebProductClient : IWebProductClient { private readonly RestClient _client; private readonly string _url; public WebProductClient() { // 修正URL格式错误 _url = "https://localhost:7123/"; var options = new RestClientOptions(_url); _client = new RestClient(options); } public async Task<RootViewModel> GetAllProduct() { var request = new RestRequest("Api/Products"); var response = await _client.ExecuteGetAsync(request); // 反序列化为正确的RootViewModel类型 var r = JsonConvert.DeserializeObject<RootViewModel>(response.Content); return r; } }
2. 修正ProductsController的Index方法
改为异步方法,正确获取并传递产品集合:
public async Task<IActionResult> Index() { var rootModel = await _client.GetAllProduct(); // 传递Products数组给视图,匹配IEnumerable<ProductViewModel>类型 return View(rootModel.Products); }
3. 视图验证
视图已声明正确的模型类型@model IEnumerable<DummyShop.Service.ViewModel.ProductViewModel>,无需修改。rootModel.Products是ProductViewModel[]类型,天然实现IEnumerable接口,可直接用于视图遍历。
额外优化建议
- 添加异常处理逻辑,捕获API调用或序列化过程中的错误:
public async Task<RootViewModel> GetAllProduct() { try { var request = new RestRequest("Api/Products"); var response = await _client.ExecuteGetAsync(request); response.EnsureSuccessStatusCode(); // 校验HTTP响应状态 var r = JsonConvert.DeserializeObject<RootViewModel>(response.Content); return r; } catch (Exception ex) { // 记录日志或自定义异常处理 throw; } }
- 确认RestSharp与Newtonsoft.Json包版本兼容,避免序列化兼容性问题
内容的提问来源于stack exchange,提问作者Kaan Yılmazer
相关产品推荐
相关产品推荐

