Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 使用json.stringify的MVC3控制器空参数_Jquery_Ajax_Json_Asp.net Mvc 3 - Fatal编程技术网

Jquery 使用json.stringify的MVC3控制器空参数

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

我有一个非常简单的控制器方法,它接受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);
}
这在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
}