zoukankan      html  css  js  c++  java
  • [记录]js跨域调用mvc ActionResult扩展

    背景

      最近2个项目中都用到了js跨域访问的知识,2个项目都需要主站与各个分站之间进行数据交互、状态同步等相关操作。浏览器本身是不允许进行跨域访问,在MVC中我们可以扩展一个方法来实现这个功能。在此大家可以参考这两篇文章:http://www.cnblogs.com/lori/archive/2012/12/14/2817615.html,博问:http://q.cnblogs.com/q/53210/

    代码实现

    首先我们来写一个JsonpResult来扩展mvc本身自带的JsonResult,代码:

    /// <summary>
        /// 返回jsonp上下文
        /// </summary>
        public class JsonpResult : JsonResult
        {
            const string CALLBACKNAME = "jsonp";
            /// <summary>
            /// 复写渲染视图方法
            /// </summary>
            /// <param name="context"></param>
            public override void ExecuteResult(ControllerContext context)
            {
                if (context == null)
                {
                    throw new ArgumentNullException("当前请求上下文出错");
                }
                if ((JsonRequestBehavior == JsonRequestBehavior.DenyGet)
                    && String.Equals(context.HttpContext.Request.HttpMethod, "GET"))
                {
                    throw new InvalidOperationException("Jsonp只能是GET请求");
                }
                var response = context.HttpContext.Response;
                if (!String.IsNullOrEmpty(ContentType))
                {
                    response.ContentType = ContentType;
                }
                else
                {
                    response.ContentType = "application/json";
                }
                if (ContentEncoding != null)
                {
                    response.ContentEncoding = this.ContentEncoding;
                }
                if (Data != null)
                {
                    String buffer;
                    var request = context.HttpContext.Request;
                    var serializer = new JavaScriptSerializer();
                    if (request[CALLBACKNAME] != null)
                        buffer = String.Format("{0}({1})", request[CALLBACKNAME], serializer.Serialize(Data));
                    else
                        buffer = serializer.Serialize(Data);
                    response.Write(buffer);
                }
            }
        }

    扩展完成以后我在mvc项目中编写了一个返回JsonpResult类型的action:

    public JsonpResult Jsonp()
            {
                JsonpResult result = new JsonpResult()
                {
                     Data = new { success =true, message ="调用成功"},
                     JsonRequestBehavior = JsonRequestBehavior.AllowGet
                 };
                 return result;//反回一个jsonp(msg)对象
            }

    完成以后,新建一个mvc项目,通过js进行跨域访问,访问格式为:

    <script type="text/javascript">
        $(function () {
            $.getJSON("http://localhost:8000/jsonp/Jsonp?jsonp=?", {}, function (data) {
                alert(data.message);
            });
        })
    </script>

    程序运行,跨域调用成功:

    下面试一下通过跨域传参数,看看是否能接收到:

    分站js代码:

    <script type="text/javascript">
        $(function () {
            $.getJSON("http://localhost:8000/jsonp/Jsonp?jsonp=?", {name:"northwolf"}, function (data) {
                alert(data.message);
            });
        })
    </script>
    

    主站action代码:

    public JsonpResult Jsonp(string name)
            {
                JsonpResult result = new JsonpResult()
                {
                     Data = new { success =true, message ="接收到参数name="+name},
                     JsonRequestBehavior = JsonRequestBehavior.AllowGet
                 };
                 return result;//反回一个jsonp(msg)对象
            }

    运行效果:

    总结:

      跨域请求数据我们只需实现以上JsonpResult的扩展类型,同时在跨域请求的时候地址的时候加上jsonp=?比不可少的参数,即可实现改功能。

  • 相关阅读:
    算法的时间与空间复杂度(一看就懂)
    技术人更应该学会即兴表达
    架构设计之「数据库集群方案」
    架构设计之「数据库从主备到主主的高可用方案」
    网络中的「动态路由算法」,你了解吗?
    当你「ping 一下」的时候,你知道它背后的逻辑吗?
    不懂高性能的负载均衡设计?没关系,架构师带你飞
    piwik流量统计系统搭建(apache2.4+piwik+mysql5.6+php5.6.14)
    SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE
    CAS 实现单点登录 .NET MVC
  • 原文地址:https://www.cnblogs.com/flykai/p/3245209.html
Copyright © 2011-2022 走看看