我正在向webmethod EmailFormRequestHandler
发一个ajax帖子,我可以在客户端(通过firebug)看到请求的状态是200,但它没有达到停止点(web网络方法的第一行) )在我的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;
}
}
答案 0 :(得分:7)
你错过了jQuery JSON帖子中的内容类型:
contentType: "application/json; charset=utf-8",
请参阅此文章。当我遇到类似的问题时,它给了我很大的帮助:
您无需将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;
}
}
答案 1 :(得分:0)
你的意思是你想设置一个断点? 不要在萤火虫中设置这一点。在VS本身设置断点。然后将VS附加到本地IIS。
顺便说一句,在你的ajax调用中你设置了三个参数,你的webmethod只需要一个。并且参数名称必须相同。
ajax调用中数据属性的格式也不好。看起来应该是这样的
data: '{"to":"bfleming@allegisgroup.com","from":"bfleming@test.com","message":"sdfasdf"}',
它应该以''
为框架答案 2 :(得分: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;
}
当前端出现时,我在使用它时进行调试。
答案 3 :(得分:-1)
我注意到的第一件事是你在$ .ajax中缺少contentType:“application / json; charset = utf-8”。还要在$ .ajax中添加一个完整的回调函数,它返回jqXHR,textStatus。我认为完整的回调将有所帮助,因为textStatus是以下之一(“成功”,“未修改”,“错误”,“超时”,“中止”或“parsererror”)。这可能有助于您追踪问题。