【问题标题】:Send JSON using Ajax in Querystring along with regular params在 Querystring 中使用 Ajax 和常规参数发送 JSON
【发布时间】:2014-10-07 03:50:22
【问题描述】:

是否可以使用 Ajax GET 在查询字符串的末尾包含一个简单的 JSON 字符串?我正在使用 MVC 并从视图发送到控制器。在控制器中我希望能够做到这一点:

public class myObj
{
    public string Name { get; set; }
    public int Age { get; set; }
}

[AcceptVerbs(HttpVerbs.Get)]
public JsonResult GetData(string Id)
{
    // Get querystring parameter
    string a = Request["a"];

    // Create typed object
    if (Request["myObj"] != null)
    {
        JavaScriptSerializer jss = new JavaScriptSerializer();
        myObj myobj = null;
        myobj = jss.Deserialize<myObj>(Request["myObj"]);
    }

    ...
}

在视图中:

var myObj = '{ "Name" : "John", "Age" : "22" }';
$.ajax({
    type: "GET",
    url: "/GetData/?Id=" + $("#Id").val(),
    dataType: "json",
    data: {
        a: $('#a').val(),
        myObj: myObj
    },

    ...

});

我不认为我上面的例子说明了我为什么要这样做,但我的问题是这是否可能。当执行 Ajax GET 时,myObj 在 Controller 中始终为 null。我怀疑这是因为 data: 已经在创建 JSON 并且 myObj 的格式不正确,但我不知道如何解决这个问题,而且似乎找不到一个示例来说明如何。

如果这种组合是可能的,有人可以指出我的代码错在哪里吗?

【问题讨论】:

  • 在使用查询字符串传递数据时我会小心。尝试使用 POST 代替,您将不必担心查询字符串的限制
  • 我无法弄清楚如何在不重新加载视图的情况下使用 POST,所以我决定使用 GET。
  • 你可以很容易地改变你必须是 POST 的答案中的属性,然后做同样的事情。不同之处在于请求的大小可以在 POST 中大得多
  • 如果您进行异步调用,您的视图不应重新加载,即使它正在使用 POST。你是如何实现这个功能的? hayageek.com/jquery-ajax-post
  • Daniel,我对您关于将其设为 POST 而不是 GET 的意见非常感兴趣。我不喜欢 URL 中凌乱的查询字符串参数。我不确定您要问的是哪个功能实现。似乎每次发出 POST 时,都会调用 View 的关联控制器操作。我看到你提供了一个链接。我现在要去读它。我宁愿发布一个 POST...

标签: jquery ajax asp.net-mvc json


【解决方案1】:

由于您要传递的数据量(12 个参数)可能包含大量数据,您可能希望使用 POST 而不是 GET。

Examples of AJAX POST

var myObj= { "Name" : "John", "Age" : "22" }; //Array with similar properties to your Model

$.ajax({
    url : "/GetData/", 
    type: "POST",
    data : myObj,
    success: function(data, textStatus, jqXHR)
    {
        //data - response from server
    },
    error: function (jqXHR, textStatus, errorThrown)
    {

    }
});

并确保您的 Action 接受 HTTP POST 动词。

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult GetData(string id, string a, myObj myObj)
{
}

更多信息请参见this reference

【讨论】:

  • Daniel,我花了相当多的时间试图在不重新加载视图的情况下让 POST 工作。我放弃了,选择了 GET。我又试了一次,它似乎工作正常 - 在 Ajax 中更改 type: POST 并用 HttpVerbs.Post 装饰控制器功能。我不知道为什么它以前不起作用,但是感谢您轻推我再试一次。这是一个更好的解决方案。
  • 很高兴能帮上忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 2022-01-22
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多