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

时间:2012-01-20 19:17:30

标签: c# javascript jquery ajax

我正在向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;
    }
}

4 个答案:

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