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

Pass array of string from ajax to controller

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

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();
    }
}

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

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

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

url: "{your-other-project-url}/umbraco/Surface/Export/HandleDownloadFile",

最后,您可能想尝试删除 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);
    },
});