3

所以我正在努力使用 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 的控制台中得到以下信息:

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

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

不知道如何在这里进行...

4

1 回答 1

8

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

使用JSON 时始终使用序列化程序:

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>
于 2012-10-17T12:46:34.937 回答