我需要通过MVC应用程序的Jsonp响应发送一些数据。对于Jsonp响应方法,我使用了JsonpFilter。
这是我的Jsonp响应方法:
[JsonpFilter]
public JsonResult GetPageName()
{
return new JsonResult
{
Data = Session["Page"],
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
这是javascript函数:
$.ajax({
type: "GET",
dataType: "jsonp",
url: 'http://localhost:54845/Login/GetPageName',
contentType: "application/json; charset=utf-8",
success: function (data) {
alert(data.width + "-" + data.height);
}
});
此代码仅适用于FF。在IE中没有任何事情发生。
我的代码有什么问题?谢谢。
答案 0 :(得分:0)
您是否真的计划制作JSON数据的跨域HTTP GET?如果没有,为什么还要为JSONP烦恼呢?只需使用JSON。
答案 1 :(得分:0)
Firefox正在松散的goosey。其他浏览器都是粗鲁的人。
请参阅:JSONP callback doesn't execute when running at localhost
引用:
一个网站可以通过一个 端口列表并继续调用 localhost在不同的端口和 路径。 'Localhost'是为数不多的DNS之一 意思是动态的主机名 取决于它的时间和地点 询问,制定潜在目标 脆弱。是的,事实是这样的 将一个点(。)附加到'localhost' ('localhost。')产生了一个工作 解决方法确实暴露了安全性 漏洞,但确实提供了 [暂定]发展的解决方法 puposes。
更好的方法是映射 环回IP到新的主机名条目 hosts文件以便它可以工作 在本地,不容易被“固定” 浏览器更新,但不起作用 除了开发之外的任何地方 工作站。
答案 2 :(得分:0)
问题在于IE会话变量。 如果我用新的{var1 =“var1”替换Session [“Page”],var2 =“var2”}它可以工作。 所以我需要找到一个解决方案。 谢谢你们。
答案 3 :(得分:0)
通过修改上面的代码,我能够让JSONP与MVC一起工作。此示例通过JSONP直接将数据集绑定到html元素。
>
public class HomeController:Controller { [HTTPGET] public ActionResult HeaderJSONP() { DsPromotion.HeaderDataTable tbl = new DsPromotion.HeaderDataTable(); DsPromotion.HeaderRow row = tbl.NewHeaderRow(); row.imgBanner_src =“/ Content / Home / Image / MainBanner.gif”; tbl.Rows.Add(行); 返回新的JsonpResult {Data = tbl}; } }
> public class JsonpResult : System.Web.Mvc.JsonResult > { > public override void ExecuteResult(ControllerContext context) > { > this.JsonRequestBehavior = JsonRequestBehavior.AllowGet; > if (context == null) > { > throw new ArgumentNullException("context"); > } > > HttpResponseBase response = context.HttpContext.Response; > if (!String.IsNullOrEmpty(ContentType)) > { > response.ContentType = ContentType; > } > else > { > response.ContentType = "application/json"; > } > if (ContentEncoding != null) > { > response.ContentEncoding = ContentEncoding; > } > if (Data != null) > { > HttpRequestBase request = context.HttpContext.Request; > JavaScriptSerializer jsonserializer = new JavaScriptSerializer(); > DataTableConverter serializer = new DataTableConverter(); > response.Write(request.Params["jsoncallback"] + "(" + jsonserializer.Serialize(serializer.Serialize(Data, new JavaScriptSerializer())) + ")"); > } > } > }
>
function BindDataTable(dataTable){ var tableName; for(tableT in dataTable){ if(tableName.indexOf('')> 0){ tableName = tableName.split('')[0]; } } var elementAndAttrib; for(dataTable [tableName] [0]中的elementAndAttrib){ var elementID = elementAndAttrib.split('')[0]; var attribName = elementAndAttrib.split('')[1]; var attribValue = dataTable [tableName] [0] [elementAndAttrib]; $(“#”+ elementID).attr(attribName,attribValue); } } function GetHomeHeaderCallBack(tblHeader){ BindDataTable(tblHeader); } function GetHomeHeader(){ var call =“/ Home / HeaderJSONP?jsoncallback =?&” + Math.round(new Date()。getTime()); $ .getJSON(call,{format:“json”},GetHomeHeaderCallBack); } $(GetHomeHeader);
<%@ Control Language =“C#”Inherits =“System.Web.Mvc.ViewUserControl”%>
...
>
public class DataTableConverter:JavaScriptConverter { public override IEnumerable SupportedTypes { get {return new Type [] {typeof(DataTable)}; } }
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) { throw new NotImplementedException(); } public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) { DataTable listType = obj as DataTable; if (listType != null) { // Create the representation. Dictionary<string, object> result = new Dictionary<string, object>(); ArrayList itemsList = new ArrayList(); foreach (DataRow row in listType.Rows) { //Add each entry to the dictionary. Dictionary<string, object> listDict = new Dictionary<string, object>(); foreach (DataColumn dc in listType.Columns) { listDict.Add(dc.ColumnName, row[dc.ColumnName].ToString()); } itemsList.Add(listDict); } result[listType.TableName] = itemsList; return result; } return new Dictionary<string, object>(); }
}
享受! 马克布里托