将json字符串作为参数传递给webmethod

我正在向webmethod EmailFormRequestHandler一个ajaxpost,我可以在客户端(通过firebug)看到请求的状态是200但是它没有在我的webmethod中达到停止点(webmethod的第一行)。 一切都工作得很好,json param是一个object但是我正在反序列化json,我不得不将它改成字符串。

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":"bfleming@allegisgroup.com","from":"bfleming@test.com","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; } } 

你错过了jQuery JSONpost中的内容类型:

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

看到这篇文章。 当我遇到类似的问题时,它对我帮助很大:

  • 使用jQuery直接调用ASP.NET AJAX页面方法不再可用
  • 来自Internet Archive: 使用jQuery直接调用ASP.NET AJAX页面方法

您无需将ScriptManager配置为EnablePageMethods。

此外,您不需要在WebMethod中反序列化JSON序列化对象。 让ASP.NET为您做到这一点。 将WebMethod的签名更改为此(注意我将“Email”附加到单词“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; } } 

你的意思是你想设置一个断点? 不要在萤火虫中设置这一点。 在VS本身设置该断点。 然后将VS附加到本地IIS。

顺便说一句,在你的ajax调用中你设置了三个参数,你的webmethod只需要一个。 并且参数名称必须相同。

ajax调用中数据属性的格式也不好。 它看起来应该是这样的

 data: '{"to":"bfleming@allegisgroup.com","from":"bfleming@test.com","message":"sdfasdf"}', 

它应该用”框起来

可能是这段代码可以帮助某人:

 public Dictionary JsonToDictionary(dynamic request) { JObject x = JObject.FromObject(request); Dictionary result = new Dictionary(); foreach (JProperty prop in (JContainer)x) { result.Add(prop.Name, prop.Value); } return result; } 

当前端出现时,我在使用它时进行调试。

我注意到的第一件事是你在$ .ajax中缺少contentType:“application / json; charset = utf-8”。 还要在$ .ajax中添加一个完整的回调函数,它返回jqXHR,textStatus。 我认为完整的回调将有所帮助,因为textStatus是以下之一(“成功”,“未修改”,“错误”,“超时”,“中止”或“parsererror”)。 这可能有助于您追踪问题。