通过HttpHandler使用ajax获取数据

时间:2012-10-17 10:50:55

标签: c# ajax json httphandler

所以我正在努力用AJAX获取一些数据。一切似乎都运行正常,但我实际上并没有在我的页面上获取数据:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript">
    function getMailDetail(mailId) {
        $.ajax({
            type: "GET",
            url: "GetMail.ashx",
            data: "mid=" + mailId,
            success: function (data) {
                console.log(data);
                var pnlMail = $('#<%= pnlMail.ClientID %>');
                var lblFrom = $('#<%= lblFrom.ClientID %>');
                var lblDate = $('#<%= lblDate.ClientID %>');
                var lblSubject = $('#<%= lblSubject.ClientID %>');
                var lblMessage = $('#<%= lblMessage.ClientID %>');

                lblFrom.text(data.From);
                lblDate.text(data.Date);
                lblSubject.text(data.Subject);
                lblMessage.text(data.Message);

                pnlMail.css("display", "block");
            }
        });
    }
</script>

我已记录data以检查其值。由于这是我第一次尝试,我不确定会发生什么,但是,我相信我应该回到名称:价值对。目前控制台绝对没有任何记录。没有任何价值。

这是我的HttpHandler:

    public void ProcessRequest(HttpContext context)
    {
        string mailid = context.Request.QueryString["mid"].ToString();
        context.Response.ContentType = "text/json";

        context.Response.Write(showMailDetail(mailid));
    }

    protected string showMailDetail(string id)
    {
        int mailid = int.Parse(id);

        string From = "";
        DateTime Date = DateTime.Now;
        string Subject = "";
        string Message = "";

        MySqlContext db = new MySqlContext();

        string sql = "select m.datesent, m.subject, m.message, u.firstname, u.lastname from mail m inner join users u on m.sender = u.userid where m.mailid = @id";

        List<MySqlParameter> args = new List<MySqlParameter>();
        args.Add(new MySqlParameter() { ParameterName = "@id", MySqlDbType = MySqlDbType.Int32, Value = mailid });

        MySqlDataReader dr = db.getReader(sql, args);

        if (dr.HasRows)
        {
            dr.Read();

            From = (string)dr["firstname"] + " " + (string)dr["lastname"];
            Date = dr.GetDateTime("datesent");
            Subject = (string)dr["subject"];
            Message = (string)dr["message"];
        }
        dr.Close();

        string result = "{ 'From' : " + From + ", 'Date' : " + Date.ToString("yyyy/MM/dd HH:mm:ss") + ", 'Subject' : " + Subject + ", 'Message' : " + Message + " }";

        return result; 
    }

任何人都可以帮我弄清楚为什么我在这里没有得到任何东西?我已经完全准备好了我做错了......

我根据文章编写了代码 http://www.codeproject.com/Articles/170882/jQuery-AJAX-and-HttpHandlers-in-ASP-NET

修改
发现我在我的SQL中使用了不正确的列名 - 应该是m.sender而不是m.senderid ...但是,我现在有另一个问题。

当我触发处理程序时,我在Chrome控制台中获得以下内容:

  

获取GetMail.ashx?mid = 1 500(内部服务器错误)jquery.min.js:2

编辑2
更正了处理程序代码中的更多错误,现在任何地方都没有出现错误,但看起来点击实际上并没有触发任何内容......

不确定如何继续...

1 个答案:

答案 0 :(得分:8)

哇,永远不要通过使用字符串连接来手动构建JSON,你永远不会做对。

使用JSON时始终使用serializer

public void ProcessRequest(HttpContext context)
{
    int mailid = int.Parse(context.Request["mid"]);
    var detail = GetMailDetail(mailid);

    if (detail != null)
    {
        context.Response.ContentType = "application/json";
        string json = new JavaScriptSerializer().Serialize(detail);
        context.Response.Write(json);
    }
    else
    {
        context.Response.StatusCode = 404;
    }
}

protected object GetMailDetail(int mailid)
{
    string sql = "select m.datesent, m.subject, m.message, u.firstname, u.lastname from mail m inner join users u on m.senderid = u.userid where m.mailid = @id";

    var args = new[]
    {
        new MySqlParameter 
        { 
            ParameterName = "@id", 
            MySqlDbType = MySqlDbType.Int32, 
            Value = mailid 
        }
    }.ToList();

    MySqlContext db = new MySqlContext();
    using (MySqlDataReader dr = db.getReader(sql, args))
    {
        if (dr.Read())
        {
            return new 
            {
                From = string.Format("{0} {1}", dr["firstname"], dr["lastname"]),
                Date = dr.GetDateTime("datesent").ToString("yyyy/MM/dd HH:mm:ss"),
                Subject = dr["subject"],
                Message = dr["message"]
            }
        }
        return null;
    }
}

现在让我们看一下客户端电话。您似乎已经定义了一些getMailDetail函数,但您似乎没有在任何地方调用它,或者至少您没有显示它。

这是一个完整的例子:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript">
    function getMailDetail(mailId) {
        $.ajax({
            type: 'GET',
            url: '<%= ResolveUrl("~/GetMail.ashx") %>',
            data: { mid: mailId },
            success: function (data) {
                console.log(data);
            }
        });
    }
</script>

<div onclick="getMailDetail(5);">Click to get mail detail</div>