使用jQuery从另一个域中检索单个值

时间:2010-04-21 20:54:08

标签: c# asp.net jquery service

我正在为一个有资金驱动的慈善机构做一些工作。每当有人做出承诺时,他们的承诺金额都会记录到SQL Server。他们希望将承诺总额发布在其他几个网站上,所以我想,“这是一个了解网络服务的好时机!”我假设我可以设置一个Web服务,将服务总额作为字符串返回,然后在调用Web服务的外部站点上转储一些jquery代码。

大约九个小时后,我仍然试图弄清楚这些东西。听起来JSONP是执行跨域请求的唯一方法,但即使在查看了一堆教程之后,我也不确定如何让我的.NET页面返回正确的值,现在我想知道是否存在这是完全做到这一点的更好方法。任何人都可以提供完全简化的代码示例吗?

TL; DR:我需要使用来自其他网络服务器的jquery或javascript将一个值返回到一堆页面。

2 个答案:

答案 0 :(得分:0)

JSONP是要走的路。底线是您提供一个函数名称用作查询字符串中的回调,将返回的数据序列化为JSON,然后将序列化数据(字符串)包装在函数调用中。 jQuery将在脚本标记内接收到它,以便它将使用JSON数据调用回调函数。

这里有一些代码改编自我的一个ASP.NET MVC项目。给定一个序列化对象和回调参数,它将返回一个可以作为内容发回的字符串。在我的课程中,它实际上返回了一个ContentResult,但我已将其更改为返回一个简单的字符串。

public class JsonPSerializer
{
    private string Callback { get; set; }

    public JsonPSerializer(string callback)
    {
        this.Callback = callback;
    }

    private static string GetJson<T>(T obj)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            var serializer = new DataContractJsonSerializer(typeof(T));
            serializer.WriteObject(stream, obj);

            return Encoding.UTF8.GetString(stream.GetBuffer().TakeWhile( b => b != '\0')).ToArray());
        }
    }

    public string Serialize<T>(List<T> list) where T : IModel
    {

        StringBuilder builder = new StringBuilder();
        builder.AppendFormat("{0}([", Callback);
        foreach (var obj in list)
        {
            builder.Append(GetJson(obj));
            builder.Append(",");
        }
        return builder.ToString().TrimEnd(',') + "])";
    }

    public string Serialize<T>(T obj) where T : IModel
    {
        string content = GetJson(obj);
        return  Callback + "(" + content + ")";
    }
}

答案 1 :(得分:0)

这是您的“完全简化的代码示例”:

您的WebMethod(将其放在example.aspx代码后面的文件中):

[WebMethod(CacheDuration = 0, EnableSession = true)]
public static YourResultType YourMethodName(string param1,int param2)
{
    YourResultType result=new YourResultType();
    result.x1=true;
    result.x2="The Response can be in any type";
return result;
}

您的结果类型:

public class YourResultType
{
  public YourResultType(){}
  public bool x1;
  public string x2;
}

JavaScript代码(基于jQuery):

$.ajax({
    type: "POST", cache: false,
    url: "example.aspx/YourMethodName",
    data: "{'randomparam':'" + ((new Date()).getTime()) + 
    //randomparam is for preventing cache
    "','param1':'param1Value','param2':'param2Value'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        if (msg.hasOwnProperty("d")) msg = msg.d;
        //And Here, The msg parameter, 
        //contains the result of the WebMethod 
        //and you can use that like this:
        alert(msg.x1);      
        alert(msg.x2);
    }
});