如何解决无法弄清楚为什么我在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({\“ results \”:[{\“ id \”:1,\“ title \”:\“ a \”},{\“ id \”:1,\“ title \”:\“ a \“},{\” id \“:1,\”标题\“:\” a \“},{\” id \“:1,\”标题\“:\” a \“},{\ “ id \”:1,\“ title \”:\“ a \”},{\“ id \”:1,\“ title \”:\“ a \”},{\“ id \”:1 ,\“标题\”:\“ a \”},{\“ id \”:1,\“标题\”:\“ a \”},{\“ id \”:1,\“标题\” :\“ a \”},{\“ id \”:1,\“标题\”:\“ a \”},{\“ id \”:1,\“标题\”:\“ a \” },{\“ id \”:1,\“ title \”:\“ a \”},{\“ id \”:1,\“ title \”:\“ a \”},{\“ id \“:1,\” title \“:\” a \“}],\” success \“:true});回叫1001({\” results \“:[{\” id \“:1,\” title \“:\” a \“},{\” id \“:1,\” title \“:\” a \“},{\” id \“:1,\” title \“:\” a \“},{\” id \“:1,\”标题\“:\” a \“},{\” id \“:1,\”标题\“:\” a \“},{ \“ id \”:1,\“ title \”:\“ a \”},{\“ id \”:1,\“ title \”:\“ a \”},{\“ id \”: 1,\“标题\”:\“ a \”},{\“ id \”:1,\“标题\”:\“ a \”},{\“ id \”:1,\“标题\ “:\” a \“},{\” id \“:1,\” title \“:\” a \“},{\” id \“:1,\” title \“:\” a \ “},{\” id \“:1,\”标题\“:\” a \“},{\” id \“:1,\”标题\“:\” a \“}],\” success \“:true});
为什么我的ѭ3序列化了两次?
解决方法
问题出在您的扩展方法中:
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框架的责任是在ѭ6上而不是您自己调用ѭ5not方法。
另外,如果您在StackOverflow上找到此代码,为什么要使用它(c)Microsoft Corporation。版权所有。 :-)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。