将 JavaScript 数组传递给 IEnumerable 会给出空值

Posted

技术标签:

【中文标题】将 JavaScript 数组传递给 IEnumerable 会给出空值【英文标题】:Passing a JavaScript array to IEnumerable gives null values 【发布时间】:2013-01-19 11:04:51 【问题描述】:

我在 MVC 3 中将 javascript 数组传递给我的控制器时遇到了很大的麻烦。我不断得到空值,感觉我已经尝试了所有传递数组的方法。下面是 JavaScript、Questions 的相关视图模型和控制器签名。我会很感激任何帮助。我的 JavaScript 没有出现任何错误,我想我一定是遗漏了一些基本的东西。

控制器正确接收idresponse-id 的值。

javascript

$("#form-submit-scores").submit(function () 

        var question = [],
        var item = [],

        $('.questionRow').each(function (index) 
            question[index] = new Array();
            var fullQuestionId = $(this).attr('id');
            var fullQuestionParts = fullQuestionId.split('-');
            question[index].QuestionId = fullQuestionParts[fullQuestionParts.length - 1];
            question[index].QuestionScore = $('.scoreBoard').val();
        );

        $('.itemRow').each(function (index) 
            item[index] = new Array();
            item[index].ItemId = $(this).attr('id');
            item[index].ItemScore = $('.scoreBoard').val();
        );

        var url = "/ctr/SaveResponse",
            data = 
                Id: $('#id').val(),
                ResponseId: $('#response-id').val(),
                Questions: question,
                Items : item
            ,

        if (isSubmitScores) 
            url = "/ctr/SubmitResponse"
        

        $.ajax(
            url: url,
            type: 'Post',
            data: data,
            traditional:true,
            datatype: "json",
            contentType: "application/json; charset=utf-8",
            success: function (result) 
                if (!result.Success) 

....
....
....

视图模型

public class SubmitResponseViewModel
    
        public int Id  get; set; 
        public int ResponseId  get; set; 
        IEnumerable<SubmitResponseScoresQuestionViewModel> Questions get;set;
        IEnumerable<SubmitResponseScoresItemViewModel> Items  get; set; 
    



public class SubmitResponseScoresQuestionViewModel
    
        public int QuestionId  get; set; 
        public decimal? QuestionScore  get; set; 
    

控制器签名

public JsonResult SubmitResponseScores(SubmitResponseScoresViewModel model)

正如我上面所说,我的模型现在包含 Idresponse-id 的正确值,但 QuestionsItems 的值为空。我已经确认我的 data 正在 AJAX 调用中填充,所以我认为我没有为控制器提供适当格式的数据。

编辑:1

Chrome JS 调试器:AJAX 数据对象

  JSON.stringify(data, null, 2)
"
  "Id": "1027",
  "ResponseId": "26",
  "Questions": [
    
      "QuestionId": "7",
      "QuestionScore": "0"
    ,
    
      "QuestionId": "2",
      "QuestionScore": "0"
    ,
    
      "QuestionId": "1",
      "QuestionScore": "0"
    
  ],
  "Items": [
    
      "ItemId": "434",
      "ItemScore": "0"
    
  ]
"

【问题讨论】:

也许我遗漏了一些东西,但我没有看到你在你的 JS 中触摸过 QuestionsItems。如果您使用questionitem 而不是QuestionsItems 会发生什么 抱歉,遗漏了一些东西,我现在编辑 当您指定contentType: "application/json" 时,我不确定 jQuery 是否真的会将数据转换为 JSON。您检查过正在传输的数据吗? @Barmar 我已经确认idresponse-id 在有和没有contentType: "application/json 的情况下都正确地传输到控制器。是 IEnumerable 的价值观让我感到难过。无论我做什么,我都只得到 Null 值 如果您想要更简洁的“转储”data 对象,请在调试器中打开控制台并运行:JSON.stringify(data, null, 2) 【参考方案1】:

您想使用 JSON.stringify 将数组序列化为 JSONhttps://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/JSON/stringify

1) 在 Nuget 中安装 Json.net 以包含 JsonFilter 表示法

PM> Install-Package Newtonsoft.Json

2) 在您的操作方法上放置一个 Json Filter 注释

[JsonFilter(Param = "attributes", JsonDataType = typeof(AttributeViewModel[]))]
  JsonResult SubmitResponseScores(SubmitResponseScoresViewModel model)

3) 在您的 ajax 调用中:

    data:  JSON.stringify(data), 

【讨论】:

【参考方案2】:

您的问题和项目集合需要公开,否则它们将不会在回发时绑定到模型

【讨论】:

以上是关于将 JavaScript 数组传递给 IEnumerable 会给出空值的主要内容,如果未能解决你的问题,请参考以下文章

将javascript数组传递给servlet

Javascript 是不是通过引用或值将数组传递给函数?

将 C# ASP.NET 数组传递给 Javascript 数组

将 C# ASP.NET 数组传递给 Javascript 数组

将 JavaScript 数组传递给 IEnumerable 会给出空值

将 javascript 数组传递给 c# 方法