使用C#无法获取jQuery提交的POST表单数据该如何解决?
问题解决:jQuery提交数组到C#页面无法获取数据
问题原因
你用$.post提交{ messages: conversation }时,jQuery默认会把数组序列化为表单编码格式(就是你看到的messages%5b0%5d%5brole%5d=user...这种键值对),而非整体的JSON字符串。后端直接取Request.Form["messages"]会返回null,因为表单里没有名为messages的单个字段,只有一堆以messages[xxx]命名的拆分字段。
解决方法
方法一:前端改为提交JSON字符串(推荐)
修改请求方式,把数组转成JSON字符串提交,并指定contentType为application/json:
$('#AskMe').click(function () { var question = $("#meQuestion").val(); if (question != "") { conversation.push({ "role": "user", "content": question }); isLoading(1); $.ajax({ url: "ajax/chat/response_chat.aspx", type: "POST", contentType: "application/json; charset=utf-8", data: JSON.stringify({ messages: conversation }), success: function (data) { isLoading(0); refreshQuota(); } }); } else { // 处理空输入逻辑 } });
后端接收时,读取请求体的JSON并反序列化:
using System.IO; using Newtonsoft.Json; // 定义强类型类匹配数据结构 public class ChatMessage { public string role { get; set; } public string content { get; set; } } public class ChatRequest { public List<ChatMessage> messages { get; set; } } // 在页面后台代码中读取解析 string jsonBody = new StreamReader(Request.InputStream).ReadToEnd(); var chatRequest = JsonConvert.DeserializeObject<ChatRequest>(jsonBody); var messages = chatRequest.messages; // 这里就是前端提交的conversation数组
方法二:后端直接解析表单编码的数组
如果不想修改前端,可以通过遍历表单键来拼接数组:
using System.Collections.Generic; public class ChatMessage { public string role { get; set; } public string content { get; set; } } // 解析表单数据 List<ChatMessage> messages = new List<ChatMessage>(); int index = 0; while (true) { string roleKey = $"messages[{index}][role]"; string contentKey = $"messages[{index}][content]"; // 判断当前索引的字段是否存在 if (!Request.Form.AllKeys.Contains(roleKey) || !Request.Form.AllKeys.Contains(contentKey)) { break; } // 添加到列表 messages.Add(new ChatMessage { role = Request.Form[roleKey], content = Request.Form[contentKey] }); index++; }
原代码无效原因
你尝试直接获取Request.Form["messages"],但这个字段根本不存在——表单里的键都是messages[0][role]、messages[1][content]这种拆分后的名称,所以Request.Form["messages"]返回null,后续的JSON解析自然失败。
内容的提问来源于stack exchange,提问作者Robert Benedetto
相关产品推荐
相关产品推荐

