Jquery 使用json.stringify的MVC3控制器空参数
我有一个非常简单的控制器方法,它接受Guid参数,如下所示Jquery 使用json.stringify的MVC3控制器空参数,jquery,ajax,json,asp.net-mvc-3,Jquery,Ajax,Json,Asp.net Mvc 3,我有一个非常简单的控制器方法,它接受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, na
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);
}
这在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));
});
我明白了
显示正确的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);
});
如果得到
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。如果启用了javascript,唯一的其他JS是在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();
}
});
以下操作不起作用:
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 as类型会导致调用失败。注意,根据jQuery文档,$.getJSON相当于
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
注意,没有定义类型。不确定错误到底在哪里,但在某些地方遗漏了一些东西。特别是因为在$.getJSON上传递一个实际的JSON对象实际上是有效的。我认为错误的是,您试图将o对象字符串化,而您试图传递的id在o对象内部,而不是o对象本身 所以试试这个代码
$.getJSON('@Url.Action("GetById", "User")', JSON.stringify(o.id), function () {
alert('Completed');
});
我认为问题在于默认的模型绑定器不接受通过查询字符串传递JSON的GET方法 例如:
$.getJSON('/', JSON.stringify({id:"test"}));
将生成此GET请求
获取?{%22id%22:%22test%22}HTTP/1.1
在这里,modelbinder似乎有绑定它的问题。
不严格
$.getJSON('/', {id:"test"});
将生成此GET请求
获取HTTP/1.1
MVC可以绑定它,因为它与在QueryString中发送它是一样的。
使用POST insted将很好
但是你也可以实现一个定制的活页夹,也许是这样的(我不知道怎么做)
尽量不要将其字符串化,只需:var o={id:'C21803C3-1385-462E-ACEA-AFA1E554C35'};正如人们所怀疑的那样,这确实有效。它似乎仅限于JSON.stringify()。我也有同样的问题,但我使用的是jQuery.post()。我删除了我的另一个答案,然后你指出你必须转义所有字符。我所看到的jQuery是为您做的。示例:{id:“hello”,input:“id=test”}将被转换为这个HTTP请求:id=hello&input=id%3Dtest$.getJSON('/',{o:“test”});=获取HTTP/1.1$.getJSON('/',{o:o=test});=GET HTTP/1.1和您的代码生成这个GET请求:GET?{%22id%22:%22C21803C3-1385-462E-ACEA-AFA1E554C35%22}HTTP/1.1I更担心转义引号和必须手动构建数组。我知道我在这里没有做任何不寻常的事。例如,请参见JavaScript和AJAX改进一节。我甚至完全按照他显示的那样构建数据对象,将其字符串化,但在点击控制器时为空。不幸的是,这是错误的。这给了我同样的错误。它也不适用于多参数方法。举一个JSON.stringify应该如何工作的例子,我认为这里两个缺点中较小的一个就是发布。我接受你的回答,但我没有测试你的活页夹。发送邮件就简单多了。非常感谢。我将把这些信息发送给微软,看看他们是否知道,或者有更好的答案。
$.getJSON('@Url.Action("GetById", "User")', JSON.stringify(o.id), function () {
alert('Completed');
});
$.getJSON('/', JSON.stringify({id:"test"}));
$.getJSON('/', {id:"test"});
public class Binder : IModelBinder
{
#region IModelBinder Members
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var query = controllerContext.HttpContext.Request.Url.Query;
var json = System.Web.HttpUtility.UrlDecode(query.Remove(0,1));
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Deserialize(json, bindingContext.ModelType.GetType());
}
#endregion
}