2012-01-20 187 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; 
} 

我使用它,而前端正值当调试运行第一

相关问题