将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;
    }
}

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

您在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")。这可能有助于您追踪问题。