【问题标题】:Why is JQuery passing null array to MVC controller, instead of string array?为什么 JQuery 将空数组传递给 MVC 控制器,而不是字符串数组?
【发布时间】:2017-01-25 10:33:07
【问题描述】:

好的,所以我的问题是两方面的。我正在尝试将选定行中的特定字符串值检索到 JQuery 数组中:

<script>
var finalCSG=[]; 
$('.checkbox').change(function () {
        var csg = [];
        var checkedRows = $('.checkbox:checked'); 
        $.each(checkedRows, function (index, item) 
        { 
            var row = $(this).closest('tr');
            csg.push(row.find('.connote').text());
        })
        finalCsg = csg;
    });
</script>

我的第一个问题:数组 'finalCsg' 的内容应该是简单的字母数字字符串,但它们包含很多前导和尾随空格(当我使用 console.log 来检查它们时)。我该如何解决这个问题?

现在,第二个也是更紧迫的问题。我尝试使用以下代码将此数组传递给我的 MVC 控制器(单击按钮):

var url = '@Url.Action("Assign", "TransactionHistory")';
    document.getElementById("AssignButton").onclick = function () { myFunction() };
    function myFunction() {

        $('#myDiv').load(url, { csgList: finalCsg })
    }

'TransactionHistory' 是我的控制器名称。即使在这里,变量 csgList 也包含正确的数组元素(不过,当我检查 console.log 时,我已经描述了这些空格)。但我的控制器只得到一个空字符串。控制器定义如下:

    [HttpPost]
    public ActionResult Assign(List<string> csgList)
    { 
        return Content("Hi");
    }

我最初尝试使用 string[] csgList 作为参数,然后尝试使用 List 但它总是从 JQuery 中得到一个空值(或者我猜是空字符串)(return 语句只是为了测试,现在没有太大意义)。有些帖子提到了“传统”关键字的使用,但我主要不是前端开发人员(我正在为工作中的某个人提供服务,有严格的截止日期),所以我无法使用它来达到适当的效果。

任何输入都会非常有益。

【问题讨论】:

  • 你的参数是一个集合,所以数据需要{ [0].csgList: someValue, [1].csgList: anotherValue, .... }(即索引)或者你需要对数据进行字符串化并设置contentType: 'json'(或者你可以使用traditional: true选项。使用$.ajax() 更容易做到这一点。
  • string[]IEnumerable&lt;string&gt; 或 List` 都可以。但是您不能按原样通过csgList。它需要像我在第一条评论中指出的那样 - 例如使用JSON.stringify() 进行字符串化并设置contentType 选项
  • 但是如果我需要更改 JQuery 代码,我究竟应该在哪里进行您指定的更改(例如对数据进行字符串化、使用 $.ajax()、设置传统:true 等)?
  • 好的,非常感谢!我会等着的。答案可以挽救我的工作......现在,直到我寻找一个与我的技能相匹配的不同的人。

标签: jquery arrays asp.net-mvc


【解决方案1】:

由于您传递了一组简单值,因此您可以使用traditional: true ajax 选项正确绑定到您的List&lt;string&gt; csgList

var url = '@Url.Action("Assign", "TransactionHistory")';
var element = $('#myDiv');
$.ajax({
    url: url,
    type: 'POST',
    traditional: true,
    data: { csgList: finalCsg },
    success: function (response) {
        element.html(response);
    }
});

另一种方法是stringify 数据并设置contentType 选项(如果您的数组包含对象而不是简单值,则需要此替代方法)

$.ajax({
    url: url,
    type: 'POST',
    data: JSON.stringify({ csgList: finalCsg }),
    contentType: "application/json; charset=utf-8",
    success: function (response) {
        element.html(response);
    }
});

【讨论】:

  • 非常感谢!您能否让我知道当我单击 ID 为“AssignButton”的按钮时如何触发您的代码?我是否需要将您的代码放在 document.getElementById("AssignButton").onclick = 之后,还是可以将其替换为 $('#AssignmentButton').Click()?
  • $('#AssignButton').click(function(){ ...ajax call ... })
猜你喜欢
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 2013-09-05
  • 2018-09-01
  • 2016-10-28
相关资源
最近更新 更多