[记录]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=?比不可少的参数,即可实现改功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】