我需要从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();
}
}
答案 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);
},
});