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 に答える