HttpClient PostAsJsonAsync请求后控制器模型值异常,无需修改控制器的解决办法
解决方案
问题根源在于:PostAsJsonAsync会将模型序列化为JSON格式并放入请求Body中,但你的控制器方法未添加[FromBody]特性,ASP.NET Core默认会尝试从**表单数据(application/x-www-form-urlencoded)**中绑定复杂类型参数,因此JSON格式的数据无法被正确解析。
要在不修改控制器代码的前提下解决这个问题,只需要将HttpClient的请求格式改为表单数据即可:
var uri = new Uri("http://localhost:5075/Agent/ChangeAgent"); var model = new ChangeAgentRequestViewModel { Address = "test", AgentType = 1, }; // 将模型属性转换为表单键值对 var formData = new Dictionary<string, string> { { nameof(model.Address), model.Address }, { nameof(model.AgentType), model.AgentType.ToString() } }; // 创建表单格式的请求内容 var content = new FormUrlEncodedContent(formData); // 发送POST请求 var response = await _httpClient.PostAsync(uri, content);
如果你的模型属性较多,也可以通过反射自动生成表单键值对,避免手动编写:
var formData = new Dictionary<string, string>(); foreach (var prop in typeof(ChangeAgentRequestViewModel).GetProperties()) { var value = prop.GetValue(model)?.ToString(); if (value != null) { formData.Add(prop.Name, value); } } var content = new FormUrlEncodedContent(formData);
这样发送的请求会使用application/x-www-form-urlencoded格式,和控制器当前兼容的绑定逻辑匹配,无需修改控制器代码就能正确获取到Address和AgentType的值。
内容的提问来源于stack exchange,提问作者Ali Eshghi
相关产品推荐
相关产品推荐

