2012-01-20 6 views
3

私はWebメソッドEmailFormRequestHandlerにajax投稿をしていますが、クライアントの側で(firebug経由で)リクエストのステータスが200であることがわかりますが、 webmethodの)私のwebmethodで。 jsonパラメータですべてうまくいっていたのはobjectでしたが、jsonを逆シリアル化しているので、文字列に変更する必要がありました。webmethodにパラメータとしてjson stringを渡します

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", 

はこの記事を参照してください。インターネットアーカイブから

あなたが設定する必要はありません。 EnablePageMethodsへのScriptManager。

また、WebMethodでJSON直列化オブジェクトを逆シリアル化する必要はありません。 ASP.NETがあなたにそれをさせる。あなたのWebMethodの署名をこれに変更してください(C#のキーワードであり、キーワードと同じ変数やパラメータに名前を付けるのは悪いことです)。 JSON.stringify()が正しく文字列をシリアル化されますので、それに応じてJavaScriptを変更する必要があります:

// 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呼び出しで3つのパラメータを設定すると、あなたのwebmethodは1つだけです。パラメータ名は同じでなければなりません。

ajax呼び出しでのデータ属性のフォーマットも良くありません。これは、この

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

それが枠で囲まれるべき「」のようになります

+0

停止点はvs – bflemi3

-1
私が気づい

最初のものは、あなたがcontentTypeの不足しているということである:「アプリケーション/ JSONを;のcharset = 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; 
} 

フロントエンドが最初に来るときデバッグの間、私はそれを使用します。

関連する問題