2012-01-20 106 views
3

我正在做一個web方法的ajax post EmailFormRequestHandler,我可以在客戶端(通過螢火蟲)看到請求的狀態是200,但它沒有達到停止點(第一行的webmethod)在我的webmethod。一切工作正常與json param是一個object但與我反序列化JSON的方式,我不得不將它更改爲一個字符串。將json字符串作爲參數傳遞給web方法

JS:

function SubmitUserInformation($group) { 
    var data = ArrayPush($group); 
    $.ajax({ 
     type: "POST", 
     url: "http://www.example.com/components/handlers/FormRequestHandler.aspx/EmailFormRequestHandler", 
     data: JSON.stringify(data), // returns {"to":"[email protected]","from":"[email protected]","message":"sdfasdf"} 
     dataType: 'json', 
     cache: false, 
     success: function (msg) { 
      if (msg) { 
       $('emailForm-content').hide(); 
       $('emailForm-thankyou').show(); 
      } 
     }, 
     error: function (msg) { 
      form.data("validator").invalidate(msg); 
     } 
    }); 
} 

ASPX:

[WebMethod] 
public static bool EmailFormRequestHandler(string json) 
{ 
    var serializer = new JavaScriptSerializer(); //stop point set here 
    serializer.RegisterConverters(new[] { new DynamicJsonConverter() }); 
    dynamic obj = serializer.Deserialize(json, typeof(object)); 

    try 
    { 
     MailMessage message = new MailMessage(
      new MailAddress(obj.to), 
      new MailAddress(obj.from) 
     ); 
     message.Subject = "email test"; 
     message.Body = "email test body" + obj.message; 
     message.IsBodyHtml = true; 
     new SmtpClient(ConfigurationManager.AppSettings["smtpServer"]).Send(message); 
     return true; 
    } 
    catch (Exception e) 
    { 
     return false; 
    } 
} 
+0

所以你說狀態碼是'200'但是錯誤和成功回調都不會觸發? – Rafay

+0

@ 3nigma正確 – bflemi3

回答

7

你錯過的內容類型在jQuery的JSON職位:

contentType: "application/json; charset=utf-8", 

看到這篇文章。它幫助我大大,當我有一個類似的問題:

你並不需要配置ScriptManager轉換爲EnablePageMethods。

而且,你不需要反序列化JSON序列化對象在你的WebMethod。讓ASP.NET爲你做到這一點。將WebMethod的簽名更改爲此(注意,我將「電子郵件」添加到了「to」和「from」兩個字,因爲這些是C#關鍵字,並且命名與關鍵字相同的變量或參數是一種不好的做法。需要相應地改變你的JavaScript所以JSON.stringify()將序列正確的字符串:

// Expected JSON: {"toEmail":"...","fromEmail":"...","message":"..."} 

[WebMethod] 
public static bool EmailFormRequestHandler(string toEmail, string fromEmail, string message) 
{ 
    // TODO: Kill this code... 
    // var serializer = new JavaScriptSerializer(); //stop point set here 
    // serializer.RegisterConverters(new[] { new DynamicJsonConverter() }); 
    // dynamic obj = serializer.Deserialize(json, typeof(object)); 

    try 
    { 
     var mailMessage = new MailMessage(
      new MailAddress(toEmail), 
      new MailAddress(fromEmail) 
     ); 
     mailMessage.Subject = "email test"; 
     mailMessage.Body = String.Format("email test body {0}" + message); 
     mailMessage.IsBodyHtml = true; 
     new SmtpClient(ConfigurationManager.AppSettings["smtpServer"]).Send(mailMessage); 
     return true; 
    } 
    catch (Exception e) 
    { 
     return false; 
    } 
} 
+1

順便說一句,(以防萬一你不知道)JSON.stringify()在IE7中不起作用。你將需要[JSON2.js](https://github.com/douglascrockford/JSON-js) –

+0

這實際上是我最終做的。這不是一個理想的解決方案,因爲當我需要添加字段時,它不是真正可維護的。它可以很快失去控制,但現在完成這項工作。謝謝馬里奧! – bflemi3

+0

不客氣,我同意你的意見。我沒有嘗試傳遞複雜的對象,但我認爲這可能值得一試。 –

0

你的意思是你要設置一個斷點? 不要在螢火蟲中設定該點。在VS本身中設置該斷點。然後將VS附加到本地IIS。

順便說一句,在你的Ajax調用你設定了三個參數,您的WebMethod只需要一個。和參數名稱必須相同。

在Ajax調用數據屬性的格式也並不好。它應該是這樣的

data: '{"to":"[email protected]","from":"[email protected]","message":"sdfasdf"}', 

應該在被陷害'

+0

停止點設置在vs – bflemi3

-1

我注意到的第一件事是,你缺少的contentType:「應用/ JSON的;字符集= UTF-8」在$阿賈克斯。同時添加到您的$ .ajax一個完整的回調它返回jqXHR,textStatus。我認爲完整的回調會有幫助,因爲textStatus是下列其中一個(「成功」,「未修改」,「錯誤」,「超時」,「中止」或「parsererror」)。這可能有助於你追蹤這個問題。

0

可能是這段代碼可以幫助別人:

public Dictionary<string, object> JsonToDictionary(dynamic request) 
{ 
JObject x = JObject.FromObject(request); 
Dictionary<string, object> result = new Dictionary<string, object>(); 

foreach (JProperty prop in (JContainer)x) 
    { 
     result.Add(prop.Name, prop.Value); 
    } 

return result; 
} 

我使用它,而前端正值當調試運行第一

相關問題