2016-05-02 3 views
0

Ich muss ein Array von String von Ajax an einen Controller senden, und ich muss eine Datei zum Download zurückgeben. Ich sehe schon und überall sagt, dass die gleiche Lösung, aber ich kann es nicht funktionieren. Ich habe dem Controller eine Pause gemacht, bin aber nie reingekommen. Die Controller sind in verschiedenen Projekten.Pass Array von String von Ajax zu Controller

SOLUTION 
    PROJECT 1 
     Controllers 
      ApiControllers 
      RenderMvcControllers 
      SurfaceControllers 
       ExportController 
    PROJECT 2 


function GetData() { 

var stringArray = new Array(); 
stringArray[0] = "item1"; 
stringArray[1] = "item2"; 
stringArray[2] = "item3"; 
var postData = { values: stringArray }; 

$.ajax({ 
    type: "POST", 
    url: "/umbraco/Surface/Export/HandleDownloadFile", 
    data: postData, 
    dataType: "json", 
    contentType: "application/json; charset=utf-8", 
    success: function (data) { 
     alert(); 
     alert(data.Result); 
    }, 
    error: function (data) { 
     alert("Error: " + data.responseText); 
    }, 
}); 
} 

class ExportController : SurfaceController 
{ 

    [HttpPost] 
    public ActionResult HandleDownloadFile(string[] productList) 
    { 
     return CurrentUmbracoPage(); 
    } 
} 
+0

Sie angegeben haben 'contetType:‚json'' daher müssen Sie die Daten 'Daten stringify: JSON.stringify (postdata),' aber Ihre Methode muss 'public Action HandleDownloadFile (string [] Werte) sein '(oder verwende' var postData = {productList: stringArray}; ') –

Antwort

3

Wenn Sie Array-Werte über AJAX senden, werden Sie sicherstellen müssen, dass die traditional Attribut auf true gesetzt ist (was dieses Verhalten erlaubt) und dass Ihre Parameter genannt werden, entsprechen, was MVC, dass es erwartet sollte productList: (als relative standardmäßig verwendet werden würde

// This is important for passing arrays 
traditional: true, 

Zweitens, da Sie diese in ein anderes Projekt Mitteilung verfassen, können Sie explizit definieren müssen, wo das Projekt unter Verwendung einer absoluten URL ausgeführt wird, und würde wahrscheinlich auf Ihr aktuelles Projekt zeigen):

Schließlich möchten Sie möglicherweise versuchen, das contentType Attribut zu entfernen, das verwendet wird, um zu definieren, was der Server in seiner Antwort erwartet. Da Sie JSON nicht zurück erwarten (und stattdessen eine Datei erwarten), könnten Sie es entfernen.

$.ajax({ 
    type: "POST", 
    // Consider making the URL absolute (as it will be relative by default) 
    url: "/umbraco/Surface/Export/HandleDownloadFile", 
    // This is important for passing arrays 
    traditional: true, 
    // Make sure that productList is used as it matches what your Controller expects 
    data: { productList: stringArray }. 
    dataType: "json", 
    success: function (data) { 
     alert(data.Result); 
    }, 
    error: function (data) { 
     alert("Error: " + data.responseText); 
    }, 
});