VB.NET中Ajax与IHttpActionResult向Web API提交数组失败问题
问题排查与解决方案
我帮你分析下这个问题,核心是参数绑定不匹配加上Ajax请求格式配置错误,导致VB.NET Web API无法正确解析传入的数组,所以属性值都变成了Decimal类型的默认值0。结合Chrome F12的排查步骤,咱们一步步解决:
1. 先用Chrome F12确认请求的问题点
打开Chrome开发者工具(F12),切换到Network标签,发送请求后找到对应的POST请求,检查两个关键项:
- Headers:看
Content-Type是不是application/json——如果是默认的application/x-www-form-urlencoded,Web API没法正确解析JSON数组 - Payload:查看实际发送的数据格式,你当前的
data: { '': latlon }会生成非标准的表单格式,不是服务器能识别的JSON数组
2. 修正Ajax请求的配置
你当前的Ajax既没指定正确的contentType,数据格式也不对,而且对象键名和VB类的属性名不匹配,这是最关键的问题!修改后的代码如下:
var latlon = [ { latIn: 45, lonIn: -120 }, { latIn: 55, lonIn: -112 } ]; // 键名要和VB类的属性完全一致 alert(JSON.stringify(latlon)) $.ajax({ url: uri, method: "POST", contentType: "application/json", // 必须指定这个,告诉服务器请求体是JSON格式 data: JSON.stringify(latlon) // 把数组序列化为标准JSON字符串 }).done(function (result) { alert(result) }).fail(function (xhr) { alert(xhr.responseText); });
重点注意:Ajax里的对象键名必须和VB类的latIn、lonIn完全对应,之前你写的lat、lon和类属性名不匹配,服务器没法映射到正确的属性上!
3. 优化VB.NET Web API控制器(可选但推荐)
虽然当前控制器代码本身能工作,但加上FromBody特性可以明确指定从请求体获取数据,避免歧义,同时增加空值判断:
<HttpPost> Public Function Post(<FromBody> ByVal latlons As List(Of Latlon)) As IHttpActionResult If latlons Is Nothing OrElse latlons.Count = 0 Then Return Content(HttpStatusCode.BadRequest, "No valid data received") End If Dim lat1 = latlons(0).latIn Return Content(HttpStatusCode.OK, lat1) ' 这里建议返回OK状态,BadRequest是错误状态,容易混淆结果 End Function
4. 用Chrome F12验证修复效果
修改后重新发送请求,回到Network标签检查:
- Headers里的
Content-Type应该显示为application/json; charset=utf-8 - Payload里应该是标准的JSON数组:
[{"latIn":45,"lonIn":-120},{"latIn":55,"lonIn":-112}] - 响应应该返回45,而不是之前的0
这样调整后,VB.NET Web API就能正确解析传入的数组,属性值也不会是默认的0了。
内容的提问来源于stack exchange,提问作者user1617676
相关产品推荐
相关产品推荐

