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

时间:2016-05-02 13:59:50

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

1 个答案:

答案 0 :(得分:3)

如果要通过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);
    },
});