使用$ .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 / 。