3

ASP.NET MVC 3を使用しています。コントローラーに送信されていなくても、モデルを更新できるかどうか質問がありますか?おそらく、質問は完全なものですか、それとも私は間違った方法で物事をやっていますか?

コントローラメソッドへのajax呼び出しがあります。IDを渡しています。コントローラーにデータベース内のいくつかのものを見つけてもらい、モデルを更新してビューに戻したいと思います。

私はかなり大きなモデルを持っています...モデルをjavascriptオブジェクトに変換し、それをコントローラーに送信するいくつかの解決策を見つけました。それが唯一の/正しい方法ですか?

jQuery $ .ajax()postリクエストでモデルをMVCコントローラーメソッドに送信する方法

おそらくコントローラーにモデルがあり、その中のいくつかのフィールドを更新できると思いましたか?

コントローラへの呼び出し:

    function getBis(id) {
        $.ajax({
            type: "GET",
            url: '@Url.Action("GetBis")',
            data: { "id": id },
            dataType: 'json',
            cache: false,
            success: function (data) {
                // Do something here
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert("Problem!");
            }
        });
    }

コントローラコード:

    public ActionResult GetBis(string id)
    {
        BeslutIStortDTO viewModel = new BeslutIStortDTO();

        int theId;
        if (!Int32.TryParse(id, out theId))
            throw new Exception("Wrong id");

        viewModel = _blLayer.GetBIS(theId);

        // somehow update the model here!

        return View("index", viewModel);
    }
4

3 に答える 3

0

通常、マッピングを行わずにUIで変更されたものを「反映」する必要がある場合は、JQueryとコントローラーの間で「モデルを渡します」(MVCは、指定したパラメーターから新しいオブジェクトを構築するのに十分スマートです)。あなたの場合、モデルで何かを行うには ID を渡すだけでよいと言いました。したがって、ID をパラメーターとして渡し、コントローラー アクション内でそれを取得してから、処理を実行するだけです。

下のリンクを見てください

jquery ajax を使用してパラメーターをコントローラーに渡す

于 2012-05-02T09:23:29.960 に答える
0

簡単に言えば、何を意味するかに応じて、はいまたはいいえですが、設計を再検討することをお勧めします。ビューモデルではなく、実際にドメインエンティティをビューにレンダリングしようとしていると思います。これはよくある初心者の間違いです。

明確にしたいことの 1 つは、ドメイン エンティティとビュー モデルの違いです。

通常、ドメイン エンティティは永続化レイヤーから取得され、そこで状態の変更が行われます。

ビュー モデルは、ビューが HTML として出力される直前にサーバー上で作成される一時的な構造であり、ビュー テンプレートのデータ ストアハウスとして使用されます。リクエスト後にクライアントの Web ブラウザには存在せず、リクエスト後にサーバーにも存在しません。

Ajax を使用して何らかのデータ変更を行う場合、ページをリロードする代わりに、通常行うことは、最初に渡した View Model ではなく、Domain オブジェクトを (Id を介して) 変更することです (これは、もう存在しません)。

例えば。

データベース レコードに関連付けられているドメイン エンティティがあります。Person {長いID = 1;文字列名=ボブ;有効なブール値= true}

ビューモデルがあります(最初のgetコントローラー関数でbobにマップします) PersonData {long id=1;string name ="bob", enabled=true}

これを行うには、最初のページの GET コントローラー関数で、データベースからドメイン エンティティ bob を取得し、そのデータをビュー モデルのインスタンスにコピーしてから、ビュー モデルを View("EditPerson",pd) に渡します。アクションの結果は、かみそりのビュー ページとビュー モデルを通過し、必要に応じて、応答ストリームに書き込んでいる HTML に値を代入します。

これで、IT であるクライアントの Web ブラウザーに HTML が表示されます。ビュー モデルが存在しません。これで、ブラウザー側のスクリプトである Ajax がいくつかあります。たとえば、「ステータスの切り替え」リンクをクリックすると、ブラウザーは (ページを変更せずに) 指定した ajax URL にリクエストを送信し、ボブのID。コントローラー関数は、Bob のエンティティ バージョンをロードし、Bob の有効なエンティティ バージョンを適切な値に切り替えて、その変更をデータベースに永続化する必要があります。

元の VIEW モデルは、最初のページがブラウザーにレンダリングされてから存在していないため、まったく機能しません。

このパターンを実行する方法が見当たらない、達成したい具体的なことはありますか?

于 2012-05-03T19:24:22.957 に答える
0

まずモデルを更新するということは、DBのレコードを更新したいということでしょうか?get リクエストでこれを行うのは良い習慣ではありません。読み進めなければ..

GetBis メソッドでオブジェクトを取得したら、そのすべてのプロパティを変更できます。

このオブジェクトを Javascript に送信する場合は、JSON Result を使用します。

return JSON(viewModel);

もう1つ、コードの最初の行でビューモデルを初期化しないでください。不要なオブジェクトの割り当てです。

于 2012-05-02T09:30:58.140 に答える