【发布时间】:2018-05-23 19:14:14
【问题描述】:
我目前正在使用 MVC 模式开发一个 ASP.net Web 应用程序。我已经建立了一个页面,人们可以在其中将项目添加到 gridstack 部分并拖动它们(Gridstack 是一个用于创建可拖动框/对象的插件)。我的目标是将这些框的最终坐标发送到我的控制器:
function saveData() {
var pagePositions = [];
// Fill our array
$('.grid-stack-item.ui-draggable').each(function () {
var $this = $(this);
pagePositions.push({
x: $this.attr('data-gs-x'),
y: $this.attr('data-gs-y'),
w: $this.attr('data-gs-width'),
h: $this.attr('data-gs-height'),
content: $('.grid-stack-item-content', $this).html()
});
});
// Convert array to object
var pagePosData = toObject(pagePositions);
alert(pagePosData);
$.ajax({
type: "POST",
url: "savePage",
data: { positions: JSON.stringify(pagePosData) }
});
} function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i)
if (arr[i] !== undefined) rv[i] = arr[i];
return rv;
}
上面的代码填充给定html元素的属性并将它们放入一个数组中。根据互联网上的几个主题,我假设发送数组会引起麻烦,所以我插入了一个函数,将数组转换为 javascript 对象(键值对)。我通过 AJAX 调用将它们发送到我的控制器,导致错误代码 500:
[HttpPost]
public string savePage(string positions)
{
//some code
var json = positions;
var test = "";
CreatePagemodelJson obj = new JavaScriptSerializer().Deserialize<CreatePagemodelJson>(positions.ToString());
//var jsonObject = JsonConvert.DeserializeObject<CreatePagemodel>(positionsJson.ToString());
return "";
}
我在控制器内部设置了断点来读取我从参数位置获得的值,但它甚至没有到达那个点。我尝试为 Json 文件设置模型,但这里的问题是 post 调用返回动态 json 格式。
更新: 我设法让它与下面的帖子一起工作。使用以下结构,我根据我的模型将结果作为数组获得。
function saveData() {
var pagePositions = [];
// Fill our array
$('.grid-stack-item.ui-draggable').each(function () {
var $this = $(this);
pagePositions.push({
x: $this.attr('data-gs-x'),
y: $this.attr('data-gs-y'),
w: $this.attr('data-gs-width'),
h: $this.attr('data-gs-height'),
content: $('.grid-stack-item-content', $this).html()
});
});
alert(pagePositions);
$.ajax({
type: "POST",
url: "savePage",
contentType: 'application/json',
data: JSON.stringify(pagePositions)
});
}
public class Position
{
public string x { get; set; }
public string y { get; set; }
public string w { get; set; }
public string h { get; set; }
public string content { get; set; }
}
[HttpPost]
public ActionResult savePage(IEnumerable<Position> positions)
{
//some code
return View("SomeView");
}
参数位置成功返回与帖子一起发送的pagePositions数组:
我尝试在没有 JSON.stringify(pagePositions) 和 ContentType: 'application/json' 选项的情况下发送数据,但我在控制器上的参数中得到了一个空返回。
【问题讨论】:
-
你为什么要串一个字符串?也有尝试过加断点,一步步调试,看看哪里出错了?
-
必须是
data: JSON.stringify(positions) }并添加contentType: 'application/json'选项。然后将您的方法更改为public ActionResult savePage(IEnumerable<XX> positions),其中XX是包含属性x、y等的模型(并删除您的toObject()函数) -
@StephenMuecke 谢谢,这有效!我设法将结果作为数组输入控制器。我尝试了下面的答案,唯一缺少的是 JSON.stringify(pagePositions)。
-
还有
contentType: 'application/json'选项:)
标签: javascript c# jquery json asp.net-mvc