Asp.net MVC3 实现jquery跨域获取json

JSONP可以帮我们解决跨域访问的问题。JSONP is JSON With Padding. 这里我们将不再解释其原理。我们来看在ASP.NET MVC 3 如何实现。首先我们需要定义一个JsonpResult. 代码像这样, 直接继承自JsonResult, override了ExecuteResult方法

public class JsonpResult : JsonResult
{
    private static readonly string JsonpCallbackName = "callback";
    private static readonly string CallbackApplicationType = "application/json";

    /// <summary>
    /// Enables processing of the result of an action method by a custom type that inherits from the <see cref="T:System.Web.Mvc.ActionResult"/> class.
    /// </summary>
    /// <param name="context">The context within which the result is executed.</param>
    /// <exception cref="T:System.ArgumentNullException">The <paramref name="context"/> parameter is null.</exception>
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if ((JsonRequestBehavior == JsonRequestBehavior.DenyGet) &&
              String.Equals(context.HttpContext.Request.HttpMethod, "GET"))
        {
            throw new InvalidOperationException();
        }
        var response = context.HttpContext.Response;
        if (!String.IsNullOrEmpty(ContentType))
            response.ContentType = ContentType;
        else
            response.ContentType = CallbackApplicationType;
        if (ContentEncoding != null)
            response.ContentEncoding = this.ContentEncoding;
        if (Data != null)
        {
            String buffer;
            var request = context.HttpContext.Request;
            var serializer = new JavaScriptSerializer();
            if (request[JsonpCallbackName] != null)
                buffer = String.Format("{0}({1})", request[JsonpCallbackName], serializer.Serialize(Data));
            else
                buffer = serializer.Serialize(Data);
            response.Write(buffer);
        }
    }
}
接着简单定义一个扩展方法:
public static class ContollerExtensions
{
    /// <summary>
    /// Extension methods for the controller to allow jsonp.
    /// </summary>
    /// <param name="controller">The controller.</param>
    /// <param name="data">The data.</param>
    /// <returns></returns>
    public static JsonpResult Jsonp(this Controller controller, object data)
    {
        JsonpResult result = new JsonpResult()
        {
            Data = data,
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };

        return result;
    }
}

在Controller里使用它, 我们的Controller叫ApiController,其中的Action:

/// <summary>
/// Get some basic information with a JSONP GET request.
/// </summary>
/// <remarks>
///    Sample url:
///    http://localhost:50211/Api/GetInformation?key=test&callback=json123123
/// </remarks>
/// <param name="key">key</param>
/// <returns>JsonpResult</returns>
public JsonpResult GetInformation(string key)
{
    var resp = new Models.CustomObject();
    if (ValidateKey(key))
    {
        resp.Data = "You provided key: " + key;
        resp.Success = true;
    }
    else
    {
        resp.Message = "unauthorized";
    }

    return this.Jsonp(resp);
}

private bool ValidateKey(string key)
{
    if (!string.IsNullOrEmpty(key))
        return true;
    return false;
}

上面的方法接收一个string的参数,接着我们在前面加一个前缀字符串,最后返回就是Jsonp Result.

传值的Model:

public class CustomObject
{
    public bool Success { get; set; }
    public object Data { get; set; }
    public string Message { get; set; }
}

运行WebSite, 访问 http://localhost:50211/Api/GetInformation?callback=myfunction&key=haha

我们可以看到这样的结果:

myfunction({"Success":true,"Data":"You provided key: haha","Message":null})
 
好的,现在让我们在另一个站点里使用它:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Index</title>
    <script src="../../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $(‘.result‘).hide();

            $(‘#test‘).click(function () {
                $(‘.result‘).fadeOut(‘fast‘);
                $(‘.result‘).html(‘‘);

                $.ajax({
                    url: ‘http://localhost:50211/Api/GetInformation‘,
                    data: { key: $(‘input[name=key]‘).val() },
                    type: "GET",
                    dataType: "jsonp",
                    jsonpCallback: "localJsonpCallback"
                });
            });
        });

        function localJsonpCallback(json) {
            //do stuff...
            if (json.Success) {
                $(‘.result‘).html(json.Data);
            }
            else {
                $(‘.result‘).html(json.Message);
            }

            $(‘.result‘).fadeIn(‘fast‘);
        }
    </script>
</head>
<body>
    <div>
        Enter key: <input type="text" name="key" value="some data key, this parameter is optional" />
        <br /><input type="button" value="Test JSONP" id="test" />
        <div class="result">
        </div>
    </div>
</body>
</html>

这里使用的JQuery的Ajax来调用它, 熟悉JQuery的应该能看懂, 结果是在button下div显示字符串:

You provided key: some data key, this parameter is optional

在这里,也可以使用getJSON方法。 
好了,就这么简单。希望对您Web开发有帮助。

Asp.net MVC3 实现jquery跨域获取json

时间: 2024-10-16 13:25:25

Asp.net MVC3 实现jquery跨域获取json的相关文章

IT忍者神龟之jQuery 使用 $.getJSON() 跨域获取 JSON 数据

假设在服务器上有文件 http://test.unmi.cc/json.php 文件,它的内容为: [代码 1] 01 02 03 04 05 06 07 08 09 10 <?php header('Content-type: application/json'); $user = array (     "name"  => "Unmi",     "blog" => "http://unmi.cc" )

跨域获取json数据

这是天气json的数据,这里是链接,json的数据接口  http://m.weather.com.cn/data/101010100.html json的数据格式 {"weatherinfo":{"city":"北京","city_en":"beijing","date_y":"2014年3月4 日","date":"",&q

jquery跨域请求json数据

//服务端生成json数据json.php <?php $json=array("Volvo","BMW","SAAB"); $cb = $_GET['callback']; echo $cb.'('.json_encode($json, true).')'; ?> //客户端Ajax请求数据<script> $(document).ready(function() { var url="http://域名/js

jquery的ajax和getJson跨域获取json数据

原文:http://www.cnblogs.com/yqskj/archive/2013/06/12/3133247.html 很多开发人员在使用jquery在前端和服务器端进行数据交互,所以很容易会认为在前端利用jquery就可以读取任何站点的数据了.近日在进行开 发时,因为要和第三方公司的一个项目进行数据的共享,因为考虑多不占用服务器的资源,遂决定直接在html进行数据的读取,不走服务器端进行中转了.然后 正好就遇到了浏览器端跨域访问的问题. 跨域的安全限制都是指浏览器端来说的,服务器端不存

【转载1】jquery的ajax和getJson跨域获取json数据

目前浏览器端跨域访问常用的两种方法有两种: 1.通过jQuery的ajax进行跨域,这其实是采用的jsonp的方式来实现的. jsonp是英文json with padding的缩写.它允许在服务器端生成script tags至返回至客户端,也就是动态生成javascript标签,通过javascript callback的形式实现数据读取. html代码: 1 $(function(){ 2 3 $("#ww").click(function(){ 4 5 $.ajax({ 6 ty

Jquery跨域获得Json

这两天用 Jquery 跨域取数据的时候,经常碰到 invalid label 这个错误,十分的郁闷,老是取不到服务器端发送回来的 json 值, 一般跨域用到的两个方法为:$.ajax 和$.getJSON 最后,仔细安静下来,细读 json 官方文档后发现这么一段: JSON数据是一种能很方便通过JavaScript解析的结构化数据.如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型.使用这种类型的话,会创建一个查询字符串参数 callback=?

ASP.NET 跨域获取JSON天气数据

前几天做一个门户网站,在首页需要加载气象数据,采用了中央气象局的接口. 刚开始采用JSONP在前台跨域请求数据,没成功~ 后换成在c#后台请求数据返回... 前端代码: $(function () { $.ajax({ type: "GET", url: "service/getWeather.ashx", dataType: "json", success: function (data) { var weatherMS = ''; conso

javascript跨域获取json数据

项目在开发过程中,用到了天气预报的功能,所以需要调用天气预报的api,一开始以为直接用ajax调用url就可以获取天气数据,结果涉及到了跨域的问题,这里做一个记录. 说到跨域,就得知道同源策略. 同源策略(Same origin policy),是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在

ajax跨域获取json数据

一.客户端代码(html+js) Basic/jsonp_test.html <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>jsonp</title> <script src="js/jquery-1.11.2.js"></script>     <