ASP MVC и JSONP - PullRequest
       14

ASP MVC и JSONP

0 голосов
/ 29 апреля 2011

Мне нужно отправить некоторые данные через ответ Jsonp из приложения MVC.Для метода ответа 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 голосов
/ 26 июня 2011

Связывание MVC / JSONP / DataSet

Мне удалось заставить JSONP работать с MVC, изменив код выше. Этот образец напрямую связывает наборы данных с элементами HTML через JSONP.

Контроллер

>

открытый класс HomeController: контроллер { [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}; } } * +1010 *

Результат 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 (tableName в dataTable) { if (tableName.indexOf ('')> 0) { tableName = tableName.split ('') [0]; } } var elementAndAttrib; for (elementAndAttrib в dataTable [tableName] [0]) { 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

...

Настольный сериализатор

>

открытый класс DataTableConverter: JavaScriptConverter { публичное переопределение 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>();
   }

}

Наслаждайтесь! Марк Брито

0 голосов
/ 29 апреля 2011

Firefox - слабый дурак. Другие браузеры - хулиганы.

См .: Обратный вызов JSONP не выполняется при запуске на локальном хосте

Цитировать:

Веб-сайт может просто пройти через список портов и продолжайте вызывать localhost на разных портах и пути. Localhost - один из немногих DNS имена хостов, которые имеют динамическое значение в зависимости от того, когда и где это запрос, делая потенциальные цели уязвима. И да, тот факт, что добавление точки (.) к 'localhost' ('localhost.') производит рабочий Обходной путь действительно подвергает безопасности уязвимость, но предлагает [предварительный] обходной путь для развития курсовые.

Лучше подходить к картированию loopback IP для новой записи имени хоста в файл hosts, чтобы он работал локально, не склонен к "исправлению" обновление браузера, и не работает где-нибудь еще, но на разработке рабочее место.

0 голосов
/ 29 апреля 2011

Проблема с переменными сеанса IE.Если я заменяю Session ["Page"] на новую {var1 = "var1", var2 = "var2"}, это работаетПоэтому мне нужно найти решение для этого.Спасибо вам всем.

0 голосов
/ 29 апреля 2011

Планируете ли вы создавать междоменные HTTP GET для данных JSON?Если нет, зачем использовать JSONP?Просто используйте JSON.

...