0

私は以下を継承するビューを持っています:-

@model MvcApplication.Models.Application

しかし、モデル オブジェクトを渡すのと同じ方法で JSON オブジェクトをビューに渡すことができるかどうかを知る必要がありますか? 私は次のコントローラーを持っているので:-

public ActionResult ListPackages()
{
    using (var client = new WebClient())
    {
        var query = HttpUtility.ParseQueryString(string.Empty);
        //code goes here ....
        return Content(json, "application/json");
    }
}

API呼び出しを使用してJSONを返し、次のようにJavaScriptを使用してビューにJSONを表示しています:

 $.ajax({
            url: $('#geturl').data('url'),
            type: 'GET',
            cache: false,
            success: function (result) {
                $.each(result.data, function (key, val) {
                    var str = val.packageName;
                    $('<li/>', { text: str })
                        .appendTo($('#products'));
                });
            }

JavaScript を使用して JSON を表示する際の問題は、返された JSON に基づいてリンクを作成したり、JSON を含むテーブルを作成したりするなど、JSON オブジェクトを簡単に操作することが非常に困難になることです。だから私の質問は: Model オブジェクトの代わりに JSON オブジェクトをコントローラーからビューに渡すことは可能ですか?

4

2 に答える 2

4

サーバー側とクライアント側の混乱

あなたはここで2つのことを話している:

  1. ビューの作成: コントローラーはモデルをサーバー側のビューに渡しますが、メモリ内オブジェクトがビュー エンジンに渡されるため、JSON を使用してそうするのはあまり意味がありません。

  2. クライアントでの JSON データの消費: ここで話しているのは、クライアントからデータを要求し、サーバーから返された JSON を取得するクライアント サーバー Ajax 通信です。これは、ビューに渡されるモデル データとはほぼ関係ありません。

JSON を使用した最適なソリューション

クライアントでJSONデータ(あなたの場合はパッケージの配列)を簡単に消費して、結果の入力されたHTMLを生成するには、クライアント側で何らかのテンプレートを使用します。jQuery には、現在は別のプロジェクトである非最終的なテンプレート プラグインがありました。私はそれで素晴らしい経験をしましたが、他のプラグインもあります。その構文に最も慣れているものを使用してください。

これらのテンプレートをどこに配置しますか?

  1. ビューを作成する時点でサーバーから渡された JSON オブジェクトの構造がわかっている場合は、ビュー自体にテンプレートを配置でき、クライアントで使用されるまで待機します。

  2. JSON オブジェクトの構造がわからない場合は、JSON オブジェクトに沿って、または別の要求としてテンプレートを渡す必要があります。

最初の方法は通常の方法で、2 番目の方法はめったに使用されず、より動的です。

JSON を使用しない最適なソリューション

(手動またはテンプレートを使用して) JSON を HTML の結果に解析したくない場合は、いつでもコントローラー アクションに Ajax 要求を行うことができます。これにより、JSON の結果ではなく、準備された HTML が部分ビューとして返されます。このようにして、JSON データを操作することなく、その HTML をページに簡単に配置できます。

ここで何を得ますか?アプリに次の機能があるとします。

  1. パッケージのページ化されたリストを表示するビューがあります。
  2. ユーザーが最初にページにアクセスすると、パッケージの最初のページが返されます
  3. 次のページへのページングは​​ Ajax を介して行われ、リストは返されたデータに置き換えられます

後続の Ajax リクエスト用に部分ビューを作成する場合は、メイン ビューで同じ部分ビューを使用して、パッケージの最初のページを表示できます。これにより、部分的なビューを 1 つ変更するだけで、最初のページの読み込みとその後のパッケージのページングで表示が変わることが保証されます。

ビュー + JSON + テンプレートを使用した場合、パッケージ リストの2 つのプレゼンテーションを維持する必要があることを意味します。最初のページのビューで使用されるものと、後続のページングを表示するテンプレートです。

じゃあどっち?

すべての条件が同じであれば、2 番目のソリューションの方が優れています。しかし、もちろん選択はあなたの場合 (物事が等しくない場合) に依存し、あなたのシナリオでどちらが最適かを判断できるはずです。

于 2012-10-11T10:42:05.667 に答える
1

いいえ、できません。ビューは、モデルに対して厳密に型指定されている必要があります。したがって、1 つの解決策は、ビューに渡す前に、この JSON をモデル オブジェクトに逆シリアル化することです。

public ActionResult ListPackages()
{
    using (var client = new WebClient())
    {
        var query = HttpUtility.ParseQueryString(string.Empty);
        //code goes here ....

        var model = new JavaScriptSerializer().Deserialize<MyViewModel>(json);
        return View(model);
    }
}

もちろん、どこでMyViewModel作業している JSON 構造を反映します。

于 2012-10-11T10:44:21.530 に答える