将json字符串作为参数传递给webmethod
本文关键字:参数传递 webmethod json 字符串 | 更新日期: 2023-09-27 18:20:52
我正在向一个webmethod EmailFormRequestHandler
发布ajax帖子,我可以在客户端(通过firebug)看到请求的状态是200,但它没有到达我的webmethod中的停止点(webmethod的第一行)。json参数是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 JSON帖子中缺少内容类型:
contentType: "application/json; charset=utf-8",
请参阅本文。当我遇到类似的问题时,它对我帮助很大:
使用jQuery直接调用ASP.NET AJAX页面方法(不再可用)- 从Internet档案:使用jQuery直接调用ASP.NET AJAX页面方法
您不需要将ScriptManager配置为EnablePageMethods。
此外,您不需要在WebMethod中反序列化JSON序列化对象。让ASP.NET为您做到这一点。将WebMethod的签名更改为这样(注意到我在单词"to"answers"from"后面加了"Email",因为这是C#关键字,命名与关键字相同的变量或参数是一种糟糕的做法。您需要相应地更改JavaScript,以便JSON.stringfy()将正确地序列化您的字符串:
// 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;
}
}
您的意思是要设置一个断点?不要在firebug中设定这一点。在VS本身中设置该断点。然后将VS附加到本地IIS。
顺便说一句,在ajax调用中,您设置了三个参数,而您的web方法只需要一个参数。并且参数名称必须相同。
ajax调用中数据属性的格式也不好。它应该看起来像这个
data: '{"to":"bfleming@allegisgroup.com","from":"bfleming@test.com","message":"sdfasdf"}',
它应该被框在"中
这段代码可能有助于某人:
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;
}
当前端优先时,我会在调试时使用它。
我注意到的第一件事是,在$.ajax中缺少contentType:"application/json;charset=utf-8"。此外,在$.ajax中添加了一个完整的回调,它返回jqXHR,textStatus。我认为完整的回调会有所帮助,因为textStatus是以下其中之一("success"、"notmodified"、"error"、"timeout"、"abort"或"parserror")。这可能有助于您追踪问题。