ASP MVC和jsonp

时间:2011-04-29 14:33:21

标签: asp.net-mvc jsonp

我需要通过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中没有任何事情发生。

我的代码有什么问题?谢谢。

4 个答案:

答案 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)

MVC / JSONP / DataSet Binding

通过修改上面的代码,我能够让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};          }      }

JSONP结果

> 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())) + ")");
>            }
>        }
>    }

Javascript / JQuery JSON请求和回调

>

  

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”%>   

XSD

                                                                                             ...

Table Serializer

>

  

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>();
   }
     

}

享受! 马克布里托

相关问题