0

ダミーの質問で申し訳ありませんが、そのような単純なことを行うための単純でクリーンな方法が見つかりません。JavaScript によって消費される JSON オブジェクトを返す必要がある MVC コントローラーがあります。戻り値の型を JsonResult に設定して Json(objecttoserialize) を返すと、Firebug を通して、JSON コードが返され、正しく解釈されていることがわかります。とにかく、次の理由により、手動でエンコードされた JSON 文字列を使用する必要があります。

  • 返したいオブジェクトをシリアル化するコンポーネントは外部ライブラリでホストされているため、触れないでください。
  • このコンポーネントは、対応する JS オブジェクトのプロパティ NAME と VALUE を表す Dictionary メンバーを持っているため、単独でシリアル化されます。

たとえば、キーの "width" と値の "20" のような辞書のエントリは、{ width: "20" } としてシリアル化する必要があります。つまり、.NET オブジェクトに値 20 のプロパティ Width があるかのように、 JS オブジェクトのオブジェクト プロパティによって表されるそのようなプロパティ/値のペアの可変数を持つ辞書を持っているだけです。これが、コンポーネントに独自の JSON シリアル化メソッドがある理由です。したがって、それによって生成された JSON を返すだけです。

Json メソッドは .NET 入力オブジェクトをシリアル化するため、Google で検索したところ、ContentResult を使用したほうがよいことがわかりました。したがって、Content=the serialized string および ContentType = "application/json"; で ContentResult を返すことを試みました。とにかく、JS クライアントはこれが JSON オブジェクトであることを理解できないようで、失敗します。代わりに JsonResult を返すと、期待どおりに機能しますが、もちろん、Dictionary メンバーによって表されるプロパティは失われます。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 を参照しています)。誰でもヒントを与えることができますか?

4

1 に答える 1

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);
  }
}
于 2012-07-04T06:52:28.580 に答える