我有一个非常简单的控制器方法,它接受 Guid 参数,如下所示
public JsonResult GetById(Guid id)
{
var results = from a in repository.AsQueryable<Department>()
where a.Id == id
orderby a.Name
select new { id = a.Id, name = a.Name };
return Json(results, JsonRequestBehavior.AllowGet);
}
在 Chrome、IE 和 Firefox 中使用 JSON.stringify() 时,该参数始终为 null。例子...
$(document).ready(function () {
var o = new Object();
o.id = 'C21803C3-1385-462E-ACEA-AFA1E554C635';
$.getJSON('@Url.Action("GetById", "User")', JSON.stringify(o), function () {
alert('Completed');
});
});
这以前在 ASP.NET 4.0 中有效。奇怪的是以下内容确实有效。
$(document).ready(function () {
$.getJSON('@Url.Action("GetById", "User")', { "id": "C21803C3-1385-462E-ACEA-AFA1E554C635" }, function () {
alert('Completed');
})
.error(function (a, b, c) {
alert(a.responseText); alert(b); alert(c);
});
});
如果我跑...
$(document).ready(function () {
var o = new Object();
o.id = 'C21803C3-1385-462E-ACEA-AFA1E554C635';
alert(JSON.stringify(o));
});
I get
{"id":"C21803C3-1385-462E-ACEA-AFA1E554C635"}
显示正确的 JSON。如果我跑
$(document).ready(function () {
var o = new Object();
o.id = 'C21803C3-1385-462E-ACEA-AFA1E554C635';
var json_text = JSON.stringify(o, null, 2);
alert(json_text);
var your_object = JSON.parse(json_text);
alert(your_object.id);
});
If get
C21803C3-1385-462E-ACEA-AFA1E554C635
补充笔记,
我已经尝试过将其作为 ajax 帖子,同样的问题。我尝试了一篇有限的文章,但请参阅下面的完整作品。
我尝试插入空格,如 JSON.stringify(o, null, 2),同样的问题。
使用 jquery-1.7.1.min.js、jquery-ui-1.8.16.custom.min.js、jquery.unobtrusive-ajax.js、jquery.validate.min.js 和 jquery.validate.unobtrusive.min。 js。唯一的其他 JS 是在启用了 javascript 的情况下在 jquery 对话框中打开表单并创建可单击的表格。
$.ajaxSetup({ cache: false });
$(document).ready(function () {
$(".openDialog").live("click", function (e) {
e.preventDefault();
$("<div></div>")
.addClass("dialog")
.attr("id", $(this).attr("data-dialog-id"))
.appendTo("body")
.dialog({
title: $(this).attr("data-dialog-title"),
close: function () { $(this).remove() },
modal: true
})
.load(this.href);
});
$(".close").live("click", function (e) {
e.preventDefault();
$(this).closest(".dialog").dialog("close");
});
var clickableTable = $('tr[data-tr-clickable-url]');
if (clickableTable.length > 0) {
clickableTable.addClass('clickable') // Add the clickable class for mouse over
.click(function () {
window.location.href = $(this).attr('data-tr-clickable-url');
});
// Remove the last child, containing anchors to actions, from each row, including the header.
$('tr :last-child').remove();
}
});
UPDATE
以下作品:
var o = new Object();
o.Id = 'C21803C3-1385-462E-ACEA-AFA1E554C635';
$.ajax({
url: '@Url.Action("GetById", "User")',
type: "POST",
data: JSON.stringify(o),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function () {
alert('completed');
}
});
以下不起作用:
var o = new Object();
o.Id = 'C21803C3-1385-462E-ACEA-AFA1E554C635';
$.ajax({
url: '@Url.Action("GetById", "User")',
data: JSON.stringify(o),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function () {
alert('completed');
}
});
因此,删除 POST 作为类型会导致调用失败。请注意,根据 jQuery 文档,$.getJSON 相当于
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
请注意,没有定义类型。不确定错误到底在哪里,但在某个地方遗漏了一些东西。特别是因为在 $.getJSON 上传递实际的 JSON 对象确实有效。