You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:50:24