背景

  最近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=?比不可少的参数,即可实现改功能。

[记录]js跨域调用mvc ActionResult扩展的更多相关文章

  1. js跨域调用mvc ActionResult扩展

    背景 最近2个项目中都用到了js跨域访问的知识,2个项目都需要主站与各个分站之间进行数据交互.状态同步等相关操作.浏览器本身是不允许进行跨域访问,在MVC中我们可以扩展一个方法来实现这个功能.在此大家 ...

  2. 如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

    客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function ...

  3. 还在问跨域?本文记录js跨域的多种实现实例

    前言 众所周知,受浏览器同源策略的影响,产生了跨域问题,那么我们应该如何实现跨域呢?本文记录几种跨域的简单实现 前期准备 为了方便测试,我们启动两个服务,10086(就是在这篇博客自动生成的项目,请戳 ...

  4. JS跨域调用之document.domain--相同基础域名页面之间的调用

    利用document.domain 实现跨域: 前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域 Javascript出于对 ...

  5. 服务器端解决JS跨域调用问题

    一. 使用JSONp方式调用 不做详细讲解,可以参考jq文档 二. 服务端配置 修改Web.config 文件 <system.webServer> <modules runAllM ...

  6. HTML页面通过JS跨域调用,子传父

    父页面:a.html 代码: <html> <head> <script type="text/javascript"> function te ...

  7. jquery Ajax跨域调用WebServices方法

    由于公司需要开发一个手机页面,想提供给同事直接在手机上可以查询SAP资料.数据需要使用js调用webserver来获取. 因为初次使用Jquery调用Webserver,所以期间并不顺利.测试调用We ...

  8. ajax——CORS跨域调用REST API 的常见问题以及前后端的设置

    RESTful架构是目前比较流行的一种互联网软件架构,在此架构之下的浏览器前端和手机端能共用后端接口. 但是涉及到js跨域调用接口总是很头疼,下边就跟着chrome的报错信息一起来解决一下. 假设:前 ...

  9. AJAX跨域调用ASP.NET MVC或者WebAPI服务的解决方案

    问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模板创建一个最简单的ASP.NET Web ...

随机推荐

  1. apache-service的使用

    apache service目录设置 设置Apache HTTP Server的文件根目录(DocumentRoot) 安装Apache 时,系统会给定一个缺省的文件根目录 如果你觉得这个网页存在这个 ...

  2. linux pipes

    In Linux, a pipe is implemented using two filedata structures which both point at the same temporary ...

  3. web项目中的路径问题

    “/”表示根路径 1.“/”代表的意思不是固定的,是要根据具体的方法,才能知道在该方法中"/"所代表的含义,同样相对路径也不是固定的,需要根据具体的方法来判断具体是相对哪个路径的相 ...

  4. Java——String类

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. windows内存体系结构 内存查询,读,写(附录源码)

    “进程内存管理器”这个程序实现的最基本功能也就是对内存的读写,之前的两篇文章也就是做的一个铺垫,介绍了内核模式切换和IoDeviceControl函数进行的应用程序与驱动程序通信的问题.接下来就进入正 ...

  6. Vue.js 源码学习笔记 -- 分析前准备2 -- Object.defineProperty

    解析神奇的 Object.defineProperty   几行代码看他怎么用   var a= {} Object.defineProperty( a, "b", { value ...

  7. Android 自定义圆形旋转进度条,仿微博头像加载效果

    微博 App 的用户头像有一个圆形旋转进度条的加载效果,看上去效果非常不错,如图所示: 据说 Instagram 也采用了这种效果.最近抽空研究了一下,最后实现的效果是这样: 基本上能模拟出个大概,代 ...

  8. OO面向对象 课程总结

    测试与正确性论证的效果差差异 测试和正确性论证都是对程序进行可靠性的验证. 测试: IEEE提出了对软件测试的定义:使用人工或者自动的手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求 ...

  9. 【转】游戏buff设计参见

    其实这类帖子并没有多少的设计理论,对于策划的提升和帮助也并不大,原因其实在于其适用性太窄,当我要设计XX象棋的时候,它就滚一边去了. 废话不多说切入正题: 游戏中的BUFF/DEBUFF我们见过很多, ...

  10. 特征工程 —— 特征重要性排序(Random Forest)

    树模型天然会对特征进行重要性排序,以分裂数据集,构建分支: 1. 使用 Random Forest from sklearn.datasets import load_boston from skle ...