ASP.NET jQuery Ajax JSON: 交换数据的简单示例

5

通过两个回复帖子的帮助,问题得到了解决--请见下文。

我需要帮助获取一个简单的示例,用于在浏览器(使用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 文件相关联的以下代码。当我运行它并单击按钮时,除了我在调试器中查看 context.Request.QueryString 显示 "{}" 之外,一切都按预期工作,但我没有看到 myData 传递给 C# 代码。
我已经看过使用
string stringParam = (string)Request.Form("stringParam");

但是Visual Studio中的“Request”似乎未定义。我想要做的就是看到数据双向移动,而且好像已经完成了一半。如果有帮助,将不胜感激。
--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..)附加,并因此在ASP.NET中使用Request.Form [“field”]显示。

其次,如果您确实想发送JSON数据,则应指定要发送的类型(就像我上面所做的那样),并在接收端使用InputStream。然后需要进一步解析接收到的字符串才能获取字段值。

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

2个回答

5

其他资源建议从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://dev59.com/O3A85IYBdhLWcg3wF_cO#8714375

(该链接为英文内容,需要自行翻译)


我尝试了你建议的(stringify),但没有变化 - 在接收C#代码中,变量rq为空,并检查“context.Request.QueryString”显示一个空集“{}”。此外,其他示例不使用stringify--请参见https://dev59.com/RW025IYBdhLWcg3w3J1H。 - Eric Schneider
@EricSchneider - 你说得对。jQuery会为你完成这个任务。由于你正在使用HTTP POST方法,所以需要使用Request.Form["myValue"]来访问你的值。我已经编辑了我的回复。 - DaveB
使用Request.Form并没有帮助,但是你的第二个建议使用Request.InputStream起作用了!我得到了由JavaScript生成的序列化数据。当然,现在需要解析它,这可能是问题的根源,因为ASP.NET可能没有一个很好的映射从JSON到某些数据结构。 - Eric Schneider
最后,非常感谢!我花了数小时思考和搜索这个问题。从各种文章中我得到的印象是ASP.NET内置了JSON支持,但现在我不确定这意味着什么。...Eric - Eric Schneider
最后一条评论,使用JavaScript代码中的“var myData = { "par":"smile", smart:345 };”赋值,并使用先前提到的Request.InputStream获取传递的数据,如果在发送之前不使用stringify,则会收到par=smile&smart=345,而使用stringify则会收到{"par":"smile", "smart":345}。 - Eric Schneider
@EricSchneider - 需要将JaaScript对象转换为JSON字符串才能发送。如果使用GET HTTP动词,则数据将与您提供的名称/值对一起发送。使用POST方法时,值作为HTTP头的一部分发送。您可能希望考虑使用ASMX或WCF服务而不是ASHX处理程序,因为框架将处理其中一些序列化工作。 - DaveB

3

我可以立即做到这一点。以下是其最基本的形式:

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。还有什么想法(感谢您迄今为止的努力!)? - Eric Schneider
谢谢!这很有帮助 —— 我会在我的原始帖子中发布我的总结。...Eric - Eric Schneider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接