来自已经jsoned字符串的JsonResult

时间:2012-07-03 16:52:15

标签: jquery json model-view-controller

抱歉这个虚拟问题,但我找不到一个简单而干净的方法来做一些简单的事情。我有一个MVC控制器应该返回一个JSON对象供一些JavaScript使用;如果我将其返回类型设置为JsonResult并返回Json(objecttoserialize),我可以通过Firebug看到JSON代码被返回并正确解释。无论如何,我必须使用手动编码的JSON字符串,因为:

  • 托管我要返回的对象的序列化组件 在外部图书馆,我不应该碰它。
  • 此组件自行序列化,因为它有一个Dictionary 表示相应JS对象的属性NAME和VALUE的成员。

例如,字典中的条目如键的“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)。任何人都可以提示吗?

1 个答案:

答案 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);
  }
}