2012-10-17 65 views
3

所以我正在努力获取一些数据与AJAX。所有似乎工作好,但我实际上没有得到我的页面上的数据:通过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的控制台以下:

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

EDIT 2
代码更正失误较多的处理程序和现在有​​任何地方出现没有错误,但它并不像点击实际上是触发任何东西......

不知道如何在这里继续......

+0

你有没有试着调试处理程序的代码? –

+0

hmmm是的,我做了并修复了我发现的问题...现在它正在运行代码正常,但没有发生任何事情 – Ortund

+0

您错过了结果值中的曲线括号。 JSON格式为“{'property':value}” –

回答

8

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

始终使用serializer当您正在使用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> 
+0

第一次使用时发生了问题...''UserMail.MySqlContext':using语句中使用的类型must可以隐式转换为'System.IDisposable'' – Ortund

+0

此外,getMailDetail函数在我写入RowDataBound的GridView行的单击事件上调用 – Ortund

+0

好吧,请删除数据上下文周围的using语句。我已经更新了我的答案。 –