最近,由于工作用到了json和jsonp,由于前台是Android的,后台是MVC。一般MVC后台要返回JSON和XML这两种格式,所以选择了JSON。同时,也用到了JSONP,
简单来说,Jsonp的原理就是通过<script>标记引入一个定义好json数据的js,因为<script>标记是不受域名限制的,JSONP是基于JSON的一种形式,可以跨域传输数据。
创建一个员工类
public class Employee { public string Company { get; set; } public string Conference { get; set; } public string Name { get; set; } public int Age { get; set; } }
创建一个JsonpResult类,继承了ActionResult。
另外,JavaScriptSerializer序列器要应用System.Web.Extensions的程序集。
/// <summary> /// jsonp转换 /// </summary> public class JsonpResult : ActionResult { public object Obj { get; set; } public string CallbackName { get; set; } public JsonpResult(object obj, string callback) { this.Obj = obj; this.CallbackName = callback; } public override void ExecuteResult(ControllerContext context) { var js = new System.Web.Script.Serialization.JavaScriptSerializer(); var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")"; context.HttpContext.Response.ContentType = "application/json"; context.HttpContext.Response.Write(jsonp); } }
MVC后台数据设置:
MVC控制器方法
public ActionResult ShopSetting()
{
Employee e = new Employee();
e.Age = 20;
e.Company = "华为";
e.Conference = "年终大会";
e.Name= "Janekim";
return GetJsonP(e, callback);//调用GetJsonP方法,传参数
}//GetJsonP方法
public ActionResult GetJsonP(object obj,string callback)
{
if (string.IsNullOrEmpty(callback)) callback = "callback";
return new JsonpResult(obj,callback);
}
返回这样的结果:
callback({"Age":20,“Company”:"华为",Conference":"年终大会","Name":"Janekim"})
前台的调用:
function getUserInfo(checkUser) {
$.ajax({
type: "GET",
url: "http://xxx/employee/getjsonp?callback=?",
cache: false,
error: function () {
},
jsonp: "callback",
dataType: "jsonp",
success: function (result) {
checkUser(result);//checkUser是一个处理employee对象的function
}
});
}
如果想看简单实现jsonp格式,请看http://www.cnblogs.com/janekimyan/p/Janekim_Yan.html