C#:cshtml中JS向ActionResult发XML,控制器无法接收参数
控制器无法接收XML字符串的原因及解决办法
问题根源
1. 请求Content-Type设置错误
前端代码将Content-Type设为text/html,但实际发送的是XML数据。ASP.NET MVC无法识别该类型的请求体,无法完成参数绑定。
2. 参数绑定逻辑不匹配
默认情况下,ASP.NET MVC不会自动把请求体中的原始XML内容绑定到string类型参数上,需要明确指定读取方式。
3. 事件监听时机错误
前端的onreadystatechange事件在xmlhttp.send()之后才设置,可能错过请求完成的状态回调(虽不是接收参数的直接原因,但属于代码隐患)。
解决步骤
前端代码修正
<input type="text" placeholder="Username" id="username" /> <button type="submit" onclick="sendResult()">Submit</button> <script type="text/javascript"> function sendResult() { let username = document.getElementById('username').value; try { let xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", "/Test/Test"); // 修正Content-Type为XML类型 xmlhttp.setRequestHeader('Content-Type', 'application/xml'); // 提前设置状态监听,避免错过回调 xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState === XMLHttpRequest.DONE && xmlhttp.status === 200) { let xmlResponse = xmlhttp.responseXML; console.log(xmlResponse) } } let xml = `<?xml version="1.0"?><query><Username>${username}</Username></query>`; console.log(xml) xmlhttp.send(xml); } catch (error) { console.log(error) } } </script>
后端代码修正(两种可选方案)
方案一:直接读取请求流(推荐)
直接从请求体中读取原始XML内容,无需依赖自动绑定:
// TestController.cs public ActionResult Test() { return View(); } [HttpPost] public ActionResult Test() { string myXML; // 读取请求体的XML内容 using (var reader = new StreamReader(Request.InputStream)) { myXML = reader.ReadToEnd(); } Service1Client o = new Service1Client(); o.Test(myXML); return View(); }
方案二:配置XML格式化器实现参数绑定
如果坚持用参数接收,需配置XML格式化器支持原始字符串:
// TestController.cs public ActionResult Test() { return View(); } [HttpPost] public ActionResult Test([FromBody] string myXML) { Service1Client o = new Service1Client(); o.Test(myXML); return View(); }
同时在Global.asax中添加XML格式化器配置:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); // 添加XML媒体类型支持 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml")); }
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

