Не могу понять, почему я получаю повторяющиеся данные в сериализации jsonp.

Я использую собственный класс JsonpResult, который я нашел в моем поиск здесь на SO. Я прочитал код и понимаю, как он работает (по крайней мере, я так думаю), НО... по какой-то причине, когда я сериализую свой Object, я получаю повторяющиеся строки... Почему это должно быть?

Вот пользовательский класс

/* ****************************************************************************
 *
 * Copyright (c) Microsoft Corporation. All rights reserved.
 *
 * Content of this class was mostly derived from the original
 * JsonResult class in the System.Web.Mvc 2.0 RTM Assembly. This
 * has beeen slightly extended for use with JSONP calls.
 *
 * This software is subject to the Microsoft Public License (Ms-PL).
 * A copy of the license can be found in the license.htm file included
 * in this distribution.
 *
 * You must not remove this notice, or any other, from this software.
 *
 * ***************************************************************************/
namespace System.Web.Mvc
{
    using System;
    using System.Text;
    using System.Web;
    using System.Web.Mvc.Resources;
    using System.Web.Script.Serialization;

    public class JsonpResult : ActionResult
    {

        public JsonpResult() { }

        public Encoding ContentEncoding { get; set; }

        public string ContentType { get; set; }

        public object Data { get; set; }

        public string JsonCallback { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            this.JsonCallback = context.HttpContext.Request["jsoncallback"];

            if (string.IsNullOrEmpty(this.JsonCallback))
                this.JsonCallback = context.HttpContext.Request["callback"];

            if (string.IsNullOrEmpty(this.JsonCallback))
                throw new ArgumentNullException("JsonCallback required for JSONP response.");

            HttpResponseBase response = context.HttpContext.Response;

            if (!String.IsNullOrEmpty(ContentType))
            {
                response.ContentType = ContentType;
            }
            else
            {
                response.ContentType = "application/javascript";
            }
            if (ContentEncoding != null)
            {
                response.ContentEncoding = ContentEncoding;
            }
            if (Data != null)
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                response.Write(string.Format("{0}({1});", this.JsonCallback, serializer.Serialize(Data)));
            }
        }
    }

    //extension methods for the controller to allow jsonp.
    public static class ContollerExtensions
    {
        public static JsonpResult Jsonp(this Controller controller, object data)
        {
            JsonpResult result = new JsonpResult();
            result.Data = data;
            result.ExecuteResult(controller.ControllerContext);
            return result;
        }
    }
}

Вот мое действие контроллера

public class VimeoController : Controller
{

    //
    // GET: /Vimeo/
    public JsonpResult Read()
    {

    Models.ViewModels.JsonViewModel JsonResponse;

        try
        {
            VimeoSharp.APIs.VimeoSimple VimeoSimple = new VimeoSharp.APIs.VimeoSimple();
            // Tell VimeoSharp what channel to pull it's videos from (193328)
            List<VimeoSharp.Video> VimeoList = VimeoSimple.ChannelVideos("193328");

            // Create a viewmodel list of videos to be used.
            // we're only using id and title for this bit.
            List<Models.Pocos.Vimeo> videoList = new List<Models.Pocos.Vimeo>();
            foreach (VimeoSharp.Video record in VimeoList)
            {
                videoList.Add(new Models.Pocos.Vimeo
                {
                    id = 1, //Int32.Parse(record.ID),
                    title = "a" //(record.Title.Length > 26 ? record.Title.Substring(0, 25) + "..." : record.Title)
                });
            };

            JsonResponse = new Models.ViewModels.JsonViewModel
            {
                results = videoList,
                success = true
            };
        }
        catch {
            JsonResponse = new Models.ViewModels.JsonViewModel
            {
                results = null,
                success = false
            };
        }

        // a failed response
        return this.Jsonp(JsonResponse);
    }

}

И вот результат на выходе.

CALLBACK1001({"результаты":[{"id":1,"title":"a"},{"id":1,"title":"a"},{"id":1,"title" :"a"},{"id":1,"title":"a"},{"id":1,"title":"a"},{"id":1,"title":" a"},{"id":1,"title":"a"},{"id":1,"title":"a"},{"id":1,"title":"a" },{"id":1,"title":"a"},{"id":1,"title":"a"},{"id":1,"title":"a"}, {"id":1,"title":"a"},{"id":1,"title":"a"}],"success":true});CALLBACK1001({"результаты":[{ "идентификатор": 1, "название": "а"}, {"идентификатор": 1, "название": "а"}, {"идентификатор": 1, "название": "а"}, {"идентификатор ":1,"title":"a"},{"id":1,"title":"a"},{"id":1,"title":"a"},{"id": 1,"название":"а"},{"идентификатор":1,"название":"а"},{"идентификатор":1,"название":"а"},{"идентификатор":1, "заголовок":"а"},{"идентификатор":1,"название":"а"},{"идентификатор":1,"название":"а"},{"идентификатор":1,"название ":"a"},{"id":1,"title":"a"}],"success":true});

С какой стати мой JsonResponse сериализуется дважды?

введите здесь описание изображения


person Chase Florell    schedule 14.06.2011    source источник


Ответы (1)


Проблема в вашем методе расширения:

public static class ContollerExtensions
{
    public static JsonpResult Jsonp(this Controller controller, object data)
    {
        JsonpResult result = new JsonpResult();
        result.Data = data;
        //result.ExecuteResult(controller.ControllerContext); <-- Remove this !!!
        return result;
    }
}

Обратите внимание на строку, которую я прокомментировал. Вы в основном вызываете результат дважды. Платформа ASP.NET MVC отвечает за вызов метода ExecuteResult для ActionResult, а не за вас.

Кроме того, если вы нашли этот код на StackOverflow, почему это Авторское право (c) Microsoft Corporation. Все права защищены. :-)

person Darin Dimitrov    schedule 14.06.2011
comment
Не уверен, почему это авторское право Microsoft. Я думаю, что сообщение, которое я нашел, было извлечено из более крупного проекта. - person Chase Florell; 14.06.2011
comment
@rockinthesixstring, не беспокойтесь, это было просто для удовольствия :-) Так что же дает? Удалось ли вам добиться этого, удалив нарушающую линию? - person Darin Dimitrov; 14.06.2011
comment
Да, это было именно так. Спасибо. - person Chase Florell; 14.06.2011
comment
Я просто должен был сначала проверить это... мой лапочка был немного вялым. - person Chase Florell; 14.06.2011