【问题标题】:Using $.ajax to POST XML to MVC Controller method使用 $.ajax 将 XML POST 到 MVC 控制器方法
【发布时间】:2014-11-18 09:20:18
【问题描述】:

我有一个这样的简单控制器功能:

<HttpPost>
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 version="1.0" encoding="utf-8"?><data>XML_GOES_HERE</data>';

    // 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 documentation 上的示例为基础,并参考了hereherehere 的一些建议。我已经尝试过使用和不使用processData: false 并没有区别。

当调用进入 Controller 方法时,有效负载是 nullIf I post a simple string using some very similar code everything works fine。为了通过$.ajax 将 XML 发布到控制器,究竟需要做什么?问题出在 JavaScript 端还是 Controller 端?

【问题讨论】:

    标签: javascript jquery ajax asp.net-mvc vb.net


    【解决方案1】:

    我最终设法找到了一些提示,并最终得到了以下代码:

    $.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方法运行以确保各种不适合@987654325的字符@ 可以发送而不会失败。

    【讨论】:

      【解决方案2】:

      默认模型绑定在 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/ 中所述。

      【讨论】:

        【解决方案3】:

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

        所以,类似...

        var data = '<?xml version="1.0" encoding="utf-8"?><data>XML_GOES_HERE</data>';
        
        $.ajax({
            url: "/Data/SaveXML/",
            type: "POST",
            processData: false,
            contentType: "text/xml",
            data: { payload: data }
        })
        

        【讨论】:

        • 我有点迷茫,in your other question,这个好像已经回答了,解决了?
        • 如果您再次检查,即使他们使用非常相似的 JavaScript,这与这之间也会有明显的区别。这里我问的是如何发送 XML,而另一个问题只发送一个简单的字符串。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-30
        • 2015-09-13
        • 2012-07-06
        • 1970-01-01
        • 2013-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多