我正在使用我在searching here on SO中找到的自定义JsonpResult类。我已经阅读了代码并且我理解它是如何工作的(至少我认为我这样做),但是......出于某种原因,当我序列化我的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, “标题”: “一个”},{ “ID”:1, “标题”: “一个”},{ “ID”:1, “标题”: “一个”},{ “ID”:1, “标题”: “一个”},{ “ID”:1, “标题”: “一个”},{ “ID”:1,“标题“:” 一个 “},{” ID “:1,” 标题 “:” 一个 “},{” ID “:1,” 标题 “:” 一个 “},{” ID “:1,” 标题“: “一”},{ “ID”:1, “标题”: “一个”},{ “ID”:1, “标题”: “一个”},{ “ID”:1, “标题”:“一“},{” ID “:1,” 标题 “:” 一个 “},{” ID “:1,” 标题 “:” 一个 “}],” 成功 “:真}); CALLBACK1001({” 结果” :[{ “ID”:1, “标题”: “一个”},{ “ID”:1, “标题”: “一个”},{ “ID”:1, “标题”: “一个”}, { “ID”:1, “标题”: “一个”},{ “ID”:1, “标题”: “一个”},{ “ID”:1, “标题”: “一个”},{” ID “:1,” 标题 “:” 一个 “},{” ID “:1,” 标题 “:” 一个 “},{” ID “:1,” 标题 “:” 一个 “},{” ID” :1, “标题”: “一个”},{ “ID”:1, “标题”: “一个”},{ “ID”:1, “标题”: “一个”},{ “ID”:1 “标题”: “一个”},{ “ID”:1, “标题”: “一个”}], “成功”:真});
为什么我的JsonResponse
被序列化两次?
答案 0 :(得分:2)
问题出在你的扩展方法中:
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。保留所有权利。: - )