C# MVC 4:将JavaScript数组从视图传递到控制器

11

在MVC 4中,如何使用AJAX将View中的JavaScript数组传递到Controller中的函数?

这种方法似乎行不通:

$.ajax(
        {
            type: "POST",
            url: "../Home/SaveTable",
            data: { function_param: countryArray }
        });

问题在于,countryArray 是 JavaScript View 中的全局数组,并且我已经检查过它被传递之前是否有元素。但是,当 saveTable 函数接收该数组时,该函数说它收到了一个空的 string[] 数组。

我只知道从 ControllerView 传递数组时,您需要使用 return Json(data, JsonRequestBehavior.AllowGet); 对复杂数据类型进行序列化,然后通过将其设置为 "var" 变量来进行反序列化。

因此,我可能也需要这样做,但是怎么做呢?

编辑1:

这是 SaveTable 函数的简短版本:

public string SaveTable(string[] function_param)
{
    if (function_param != null && function_param > 0)
    {
       //some code                
       return "Success";
    }

    //The following code will run if it's not successful. 
    return "There must be at least one country in the Region.";
    //Yeah it's always returning this b/c function_param is null;         
 }

2
控制器长什么样? - Mark S
检查您的请求有效载荷,以确定数据是否真正发送到控制器。 - Saravana
@Mark 我的控制器有返回视图的ActionResult方法和用于访问数据库的方法。这是一个根据传入数组访问数据库的函数。 - RedAces
@Saravana 我在谷歌上找不到任何信息来检查 AJAX 是否实际发送数据,但我认为问题在于 C# 无法解释 JavaScript 数组。这可能是为什么它默认为空的原因。我不知道将 JavaScript 数组序列化为 JSON 以便 C# 可以解释它的语法。 - RedAces
考虑使用 Fiddler 来检查 Ajax post 是否发送了数组以及其格式是什么。 - Daniel Conde Marin
function_param > 0 should be function_param.Length > 0 - Ryan Dooley
3个回答

22

在序列化数组时,您需要设置 traditional: true

$.ajax({
    type: "POST",
    traditional: true,
    url: "../Home/SaveTable",
    data: { function_param: countryArray }
});

在这里找到了一个关于traditional: true的很好的解释:https://dev59.com/wG035IYBdhLWcg3wT-NC#5497151

编辑:

如果您不想使用traditional: true,可以使用JSON.stringify将数据作为字符串传递,并指定contentType

$.ajax({
    type: "POST",
    url: "../Home/SaveTable",
    contentType: 'application/json',
    data: JSON.stringify({function_param: countryArray}),
});

我看了你的链接,那里的答案暗示传统方式已经过时,新方式更好。那么使用传统方法序列化数组的好处是什么? - RedAces
2
无论如何,它都没有起作用,该函数仍然获取一个空的string[]数组。 - RedAces
谢谢你的想法! 从视图传递复杂数据类型到控制器实际上是一个难以完成的任务(也许Jon Skeet可以做到)。 我决定将数组转换为字符串,用特殊字符分隔,在JavaScript中模拟数组,然后使用AJAX将长字符串传递给函数。然后在函数中解释它。 - RedAces

2

你的Ajax:

$.ajax({
    type: "POST",
    url: "../Home/SaveTable",
    contentType: 'application/json',
    data: {function_param: JSON.stringify(countryArray)},
});

在你的控制器中:

using Newtonsoft.Json;

    public string SaveTable(string function_param)
    {
       dynamic func_param = JsonConvert.DeserializeObject(function_param)
    }

然后您就能在控制器中使用foreach了。

2
您应该在控制器上使用以下代码:
public string SaveTable(object[] function_param)
{
   //some code
}

应该完成这项工作,这是为了未来的用户。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接