使用x2js转JSON为XML传递到MVC控制器时参数为null如何解决
问题原因
- x2js调用错误:
x2js.json2xml_str()方法接收的参数是JSON对象,不是JSON序列化字符串。你先执行了JSON.stringify(model)得到字符串再传入,转换出来的XML结构不符合预期,不是你想要的模型XML数据。 - AJAX配置和传参不匹配:你设置了
contentType: 'text/xml; encoding=utf-8',说明你要提交的请求体是纯XML格式,但你实际传的是{xml: data}这种键值对结构,jQuery会默认把这个对象序列化为application/x-www-form-urlencoded格式的表单数据,和你声明的contentType完全不一致,MVC模型绑定器没法按照你的预期解析出xml参数。 - 控制器参数绑定逻辑不匹配:如果你要以表单参数的形式传递xml字符串,就不应该设置contentType为text/xml;如果你要传递纯XML请求体,控制器就不能直接用
string xml参数接收,需要额外处理请求流。
修复方案
方案1:表单参数提交(改动最小)
前端修改
- 修正x2js的调用,直接传model对象,不要先做序列化
- 删掉错误的contentType配置,让jQuery自动用默认的
application/x-www-form-urlencoded格式序列化参数 - 调整dataType为json,匹配控制器返回的JsonResult类型
let model = new Model(); model.ArticleName = "Test"; $.each(AttachmentsArray, function(i, item) { model.Files.push( new File(item.FileName, item.FileData) ); }); var x2js = new X2JS(); // 直接传JSON对象,不需要提前转字符串 var data = x2js.json2xml_str(model); $.ajax({ url: '/Home/PostUserData1', type: 'POST', data: { xml: data }, dataType: 'json', success: function(result) { if (result === "Error") { } else if (result === "OK") {} }, error: function(request) {} });
后端无需修改,控制器的string xml参数即可正常接收值。
方案2:纯XML请求体提交(符合REST规范)
前端修改
- 修正x2js调用
- 请求体直接传XML字符串,不要包裹在
{xml:xxx}对象里 - 保留contentType为text/xml
// 前面model构造逻辑保持不变 var x2js = new X2JS(); var xmlData = x2js.json2xml_str(model); $.ajax({ url: '/Home/PostUserData1', type: 'POST', // 直接传XML字符串作为请求体 data: xmlData, contentType: 'text/xml; encoding=utf-8', dataType: 'json', success: function(result) { // 原有逻辑不变 }, error: function(request) {} });
后端控制器修改
需要从请求流中读取XML内容:
public JsonResult PostUserData1() { // 从请求体读取XML字符串 string xml = new System.IO.StreamReader(Request.InputStream).ReadToEnd(); // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

