抱歉这个虚拟问题,但我找不到一个简单而干净的方法来做一些简单的事情。我有一个MVC控制器应该返回一个JSON对象供一些JavaScript使用;如果我将其返回类型设置为JsonResult并返回Json(objecttoserialize),我可以通过Firebug看到JSON代码被返回并正确解释。无论如何,我必须使用手动编码的JSON字符串,因为:
例如,字典中的条目如键的“width”和值的“20”必须序列化为{width:“20”},即.NET对象的属性Width值为20,而它只是一个字典,其中包含可变数量的此类属性/值对,由JS对象中的对象属性表示。这就是组件具有自己的JSON序列化方法的原因。因此,我应该返回它生成的JSON。
当Json方法序列化一个.NET输入对象时,我用Google搜索,我发现我宁可使用ContentResult。因此,我尝试返回ContentResult,其中Content =序列化字符串,ContentType =“application / json”;无论如何,JS客户端似乎无法理解这是一个JSON对象并失败。如果我返回一个JsonResult它按预期工作,但当然其字典成员表示的属性将丢失。我期待JsonResult等同于上面的ContentResult,但事实并非如此。 JS代码如下:
request: function (nodeId, level, onComplete) {
$.ajax({
url: "/Node/Get", type: "POST", dataType: "json",
data: { id: nodeId, level: level, depth: 3 },
success: function (data) {
var ans = data;
onComplete.onComplete(nodeId, ans);
}
});
如果我在Firebug中的脚本中放置一个断点,当我返回JsonResult时,会触发成功函数;当我返回ContentResult时,它永远不会被命中,页面仍然卡在加载请求的对象。 (这个JS指的是www.thejit.org的SpaceTree)。任何人都可以提示吗?
答案 0 :(得分:0)
我设法让它使用了一些技巧,但我想知道是否有更好的解决方案,无论如何,如果确实我真的需要使用JsonResult(或派生的)类,就像在这个技巧中)让JS正常工作。我从JsonResult派生了一个类,并更改了ExecuteResult方法,以便它只传递收到的JSON字符串:
public sealed class PassthroughJsonResult : JsonResult
{
public string Json { get; set; }
public override void ExecuteResult(ControllerContext context)
{
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 (Json != null) response.Write(Json);
}
}