使用$ .ajax将XML发布到MVC Controller方法

我有一个简单的控制器function,如下所示:

 Function SaveXML(payload As String) As Boolean If payload IsNot Nothing AndAlso payload.Length > 0 Then Return True Else Return False End If End Function 

我从这样的JavaScript调用:

 function SaveXML() { var payload = 'XML_GOES_HERE'; // Calls controller correctly but data is null $.ajax({ url: "/Data/SaveXML/", type: "POST", processData: false, contentType: "text/xml", data: payload }) .done(function () { alert('Application saved.'); }) .fail(function () { alert('Application failed to save.'); }); } 

我正在使用JQuery文档中的示例作为基础,并在 此处 , 此处和此处提供一些建议。 我已经尝试了有和没有processData: false ,它没有任何区别。

当调用进入Controller方法时,有效负载为null 。 如果我使用一些非常相似的代码发布一个简单的字符串一切正常 。 为了通过$.ajax将XML发布到Controller,需要做些什么? 问题出在JavaScript或Controller端吗?

我最终设法找到了一些关于此的提示,最后得到以下代码:

 $.ajax({ url: "/Data/SaveXML/", type: "POST", processData: false, contentType: "application/json; charset=utf-8", data: JSON.stringify({ payload: payload }) }) .done(function () { alert('Application saved.'); }) .fail(function () { alert('Application failed to save.'); }); 

关键的区别在于contentType设置为application/json ,数据被转换为一个对象,然后通过JSON.stringify方法运行,以确保可以发送不适合querystring的各种字符而不会失败。

我相信您可能需要命名要传递给控制器​​的参数。

所以,像……

 var data = 'XML_GOES_HERE'; $.ajax({ url: "/Data/SaveXML/", type: "POST", processData: false, contentType: "text/xml", data: { payload: data } }) 

默认模型绑定不适用于processData设置为false。 如果ServerXml是一个XML字符串,删除它应该使它工作:

 function SendXmlToServer(ServerXml) { $.ajax({ url: "/Home/XmlData", type: "POST", data: { ResXml: ServerXml }, dataType: "xml", success: function () { alert("Successful"); return false; } }); } 

您还必须将ValidateInput属性添加到您的操作方法,因为通常不允许“HTML标记”:

 [HttpPost] [ValidateInput(false)] public ActionResult XmlData(string ResXml) { return null; } 

或者,您可以使用自定义模型绑定来无缝地反序列化XML,如本博客文章中所述url https://lostechies.com/jimmybogard/2011/06/24/model-binding-xml-in-asp-net-mvc -3 / 。