2014-11-18 3 views
2

У меня есть простая функция контроллера, как это:

<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 в качестве базы с некоторыми советами от here, here и here. Я пробовал его с processData: false и без него.

Когда вызов поступает в метод контроллера, полезная нагрузка равна null. If I post a simple string using some very similar code everything works fine. Что конкретно нужно сделать для отправки XML в контроллер через $.ajax? Находится ли в JavaScript или контроллере проблема?

ответ

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, чтобы убедиться, что различные символы, которые непригодны для querystring, могут быть отправлены без сбоев.

0

Я считаю, что вам, возможно, потребуется указать параметр, который вы передаете контроллеру.

Так, что-то вроде ...

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 } 
}) 
+1

Я пробовал, и это не работает. –

+0

Я немного смущен, [в вашем другом вопросе] (http://stackoverflow.com/questions/26976402/using-ajax-or-post-to-call-mvc-5-controller-method), это появляется ответить и решить? –

+0

Если вы еще раз проверьте, есть ли разница между этим и этим, хотя они используют очень похожий JavaScript. Здесь я спрашиваю, как отправить XML, тогда как другой вопрос отправляет только простую строку. –

0

привязка модели по умолчанию не работает с параметром 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, как описано в этом сообщении в блоге https://lostechies.com/jimmybogard/2011/06/24/model-binding-xml-in-asp-net-mvc-3/.

Смежные вопросы