将 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 没有出现任何错误,我想我一定是遗漏了一些基本的东西。
控制器正确接收id
和response-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)
正如我上面所说,我的模型现在包含 Id
和 response-id
的正确值,但 Questions
和 Items
的值为空。我已经确认我的 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 中触摸过Questions
和 Items
。如果您使用question
和item
而不是Questions
和Items
会发生什么
抱歉,遗漏了一些东西,我现在编辑
当您指定contentType: "application/json"
时,我不确定 jQuery 是否真的会将数据转换为 JSON。您检查过正在传输的数据吗?
@Barmar 我已经确认id
和response-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 会给出空值的主要内容,如果未能解决你的问题,请参考以下文章
将 C# ASP.NET 数组传递给 Javascript 数组
将 C# ASP.NET 数组传递给 Javascript 数组