【问题标题】:asp.net jquery ajax json: Simple example of exchanging dataasp.net jquery ajax json:交换数据的简单示例
【发布时间】:2012-06-29 22:15:02
【问题描述】:

(问题在两个回复帖子的帮助下得到解决——见下文)

如果能获得在浏览器(使用 JavaScript/JQuery)和 ASP.NET(使用 Visual Studio 2010)之间交换数据 JSON 数据的简单示例,我将不胜感激。

当我点击一个按钮时,会执行以下操作:

 <script type="text/javascript">
    bClick = function () {
        var myData = { "par": "smile" };
        alert("hi "+myData.par);
        $.ajax({
            url: "ericHandler.ashx",
            data: myData,
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            success: function (data) { alert("DIDit = " + data.eric); },
            error: function (data, status, jqXHR) { alert("FAILED:" + status); }
        });
    }
</script>

在 Visual Studio 中,我有以下与 ashx 文件关联的代码。当我运行它并单击按钮时,一切都按预期工作,除了我没有看到 myData 传递给 C# 代码——我在调试器中查看 context.Request.QueryString 并显示“{}”。

我见过使用示例

string stringParam = (string)Request.Form("stringParam");

但似乎没有定义 Visual Studio“请求”。我想做的就是看到数据双向移动,而我似乎已经完成了一半。任何帮助将不胜感激。

--C#代码--

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace CSASPNETSerializeJsonString
{
/// <summary>
/// Summary description for ericHandler
/// </summary>
public class ericHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        string rq = context.Request.QueryString["par"];

        context.Response.ContentType = "application/json";
        context.Response.Write("{\"eric\":\"12345\"}");
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

}

* 已解决 首先,如果您想将一些表单参数从 JavaScript 发送到 ASP.NET,则应该使用下面第二篇文章中的 ajax 调用,并且不要对数据使用 stringify。换句话说,如果不指定要发送的数据是 json,则缺少任何规范默认为 'application/x-www-form-urlencoded')。这将导致对象的字段以“url”格式附加(field=X&field2=Y&field3=Z..),从而使用 Request.Form["field"] 在 ASP.NET 中显示。

其次,如果你真的想发送 JSON 数据,那么指定这个类型就是发送的内容(就像我在上面所做的那样)并在接收端使用 InputStream。然后需要进一步解析接收到的字符串以获取字段值。

在我的示例中,我将“手动”编码为字符串的 JSON 数据发回。我相信有一个 JSON 序列化例程,以便可以发送 C# 对象。

【问题讨论】:

    标签: jquery asp.net ajax json


    【解决方案1】:

    其他资源建议从 AJAX 调用中删除 contentType: 'application/json; charset=utf-8',

      $.ajax({ 
                url: "ericHandler.ashx", 
                data: myData, 
                dataType: 'json', 
                type: 'POST', 
                success: function (data) { alert("DIDit = " + data.eric); }, 
                error: function (data, status, jqXHR) { alert("FAILED:" + status); } 
            }); 
    

    读取服务器端的值:

    string myPar = context.Request.Form["par"]; 
    

    你也可以试试:

    string json = new StreamReader(context.Request.InputStream).ReadToEnd(); 
    

    这里提到过:https://stackoverflow.com/a/8714375/139917

    【讨论】:

    • 我尝试了你的建议(字符串化),但没有改变——在接收 C# 代码中,变量 rq 为空,检查“context.Request.QueryString”显示一个空集“{}”。此外,其他示例不使用 stringify--参见 stackoverflow.com/questions/5756147
    • @EricSchneider - 你是对的。 jQuery 为你做这件事。由于您使用的是 HTTP POST 方法。您需要使用 Request.Form["myValue"] 访问您的值。我已经编辑了我的回复。
    • 使用 Request.Form 没有帮助,但是您使用 Request.InputStream 的第二个建议奏效了!我得到了 JavaScript 生成的序列化数据。当然,现在需要对其进行解析,这可能是问题的根源,因为 ASP.NET 可能没有从 JSON 到某些数据结构的良好映射。
    • 最后,非常感谢!我花了几个小时思考和搜索这个。我从各种文章中得到的印象是 ASP.NET 内置了 JSON 支持,但我现在不确定这意味着什么。 ...埃里克
    • 最后一条评论,赋值为 "var myData = { "par":"smile", smart:345 };"在 JavaScript 代码中,并使用前面提到的 Request.InputStream 来获取传递的数据,如果您在发送之前不使用 stringify,您将收到 par=smile&smart=345 而使用 stringify 您会收到,{"par":"微笑”,“聪明”:345}。
    【解决方案2】:

    我马上就搞定了。这是它最基本的形式:

    HTML:

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
    
        <script language="javascript" type="text/javascript">
            $(document).ready(function () {
                $.ajax({
                    url: 'Handler.ashx',
                    type: 'POST',
                    success: function (data) {
                        alert(data);
    
                    },
                    error: function (data) {
                        alert("Error");
                    }
                });
            });
        </script>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
    
        </form>
    </body>
    </html>
    

    代码背后:

    <%@ WebHandler Language="C#" Class="Handler" %>
    
    using System;
    using System.Web;
    
    public class Handler : IHttpHandler
    {
    
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }
    
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
    

    【讨论】:

    • 您的示例显示数据从 ASP.NET 传递到浏览器,但我遇到的问题是将其移向另一个方向。因此,失败的行是:“string rq = context.Request.QueryString["par"];"--我试图将 myData 的“par”定义从浏览器传递到 ASP.NET。有什么进一步的想法(感谢您迄今为止的努力!)?
    • 谢谢!这很有帮助——我会把我的总结放在我原来的帖子中。 ...埃里克
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多