将字符串数组从 ajax 传递给控制器

ave*_*che 1 asp.net-mvc umbraco

我需要将一个字符串数组从 ajax 发送到控制器,我需要返回一个要下载的文件。我已经看过了,到处都说同样的解决方案,但我不能让它工作。我已经在控制器上休息了,但从未进入。 控制器在不同的项目中。

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Rio*_*ams 8

如果您通过 AJAX 发送数组值,您需要确保该traditional属性设置为 true(允许这种行为)并且您的参数命名为匹配 MVC 期望它应该是什么productList

// This is important for passing arrays
traditional: true,
Run Code Online (Sandbox Code Playgroud)

其次,由于您要将其发布到不同的项目,您可能需要使用绝对 URL 明确定义项目的运行位置(因为默认情况下会使用相对 URL 并且可能指向您当前的项目):

url: "{your-other-project-url}/umbraco/Surface/Export/HandleDownloadFile",
Run Code Online (Sandbox Code Playgroud)

最后,您可能想尝试删除该contentType属性,因为它用于定义服务器期望在其响应中接收的内容。由于您不期待 JSON 返回(而是期待一个文件),您可以考虑删除它。

$.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);
    },
});
Run Code Online (Sandbox Code Playgroud)