2012-05-02 8 views
3

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

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

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

How to send a model in jQuery $.ajax() post request to MVC controller method

私は多分、コントローラが、私はそれでいくつかのフィールドを更新することができたモデルを、持っていると思いましたか?

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

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); 
    } 
+0

あなたは何をしようとしていますか?どのモデルを更新しますか?ビューをレンダリングするために使用されたモデルは、AJAXリクエストをトリガーするまでには、ずっと前から消えていました。 –

+0

それは私が恐れていたものでした。最初のビューをレンダリングするために使用されたものを私のモデルに追加したいと思います。 – kaze

+0

このモデルはもう存在しません。データベースを直接クエリして更新することができます。 –

答えて

0

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

は、あなたがDBにレコードを更新したいモデルを更新することにより、まず、下のリンクをご覧

Pass a parameter to a controller using jquery ajax

+0

私は物事を取得するためにIDを使用している、私はビューに返信したい。モデルに追加のデータを追加する。 – kaze

0

を意味するのですか?それはgetリクエストで行うのは良い習慣ではありません。 ..

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

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

return JSON(viewModel);

ともう一つは、コード、不要なオブジェクト割り当ての1行目にビューモデルを初期化しません。

0

答えは「はい」と「いいえ」です。意味は正確には異なりますが、デザインを再検討することもできます。ビューモデルではなく、実際にドメインエンティティをビューにレンダリングしようとしていると思います。これは一般的な初心者の間違いです。

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

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

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

Ajaxを使用してデータを変更する場合は、ページを再読み込みするのではなく、元々渡したビューモデルではなく、ドメインオブジェクトを(Idを介して)変更します。 (これ以上存在しない)。

たとえば、

私はデータベースレコードに関連付けられたドメインエンティティを持っています。 人

私は(iは初期ゲットコントローラ機能にボブにマッピングすること) PersonDataビューモデルを持っている{長いID = 1;文字列名=ボブは=真有効BOOL} {長いID = 1;文字列名= "bob"、enabled = true}

これを行うには、私の初期ページのGETコントローラ機能で、ドメインエンティティボブをデータベースからプルアップし、ビューモデルのインスタンスにデータをコピーして渡します( "EditPerson"、pd)アクション結果へのビューモデルは、かみそりビューページとビューモデルを通過し、必要に応じてレスポンスストリームに書き込んでいるHTMLに値を代入します。

ここでは、クライアントのWebブラウザにHTMLがあります。これはITです。ビューモデルは存在しません。今度はブラウザ側のスクリプトであるAjaxを持っています。たとえば、「Toggle Status」リンクをクリックすると、ブラウザが(ページを変更せずに)提供したajax URLにリクエストを送信し、ボブのイド。コントローラの機能がBobのEntityバージョンをロードし、有効なBobのEntityバージョンを適切な値に切り替えると、その変更がデータベースに保持されます。

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

このパターンで行う方法がわからないことを達成したいと思っているものがありますか?

+0

私はビューモデルを使って、あなたが描くのとほぼ同じようにしています。私はもう少し詳しく説明します:最初のget(インデックス)では、selectModelを使って、データの "たくさんの"データをセレクトリストなどに取り込みます。しかし、最初の取得後にユーザーが何をするかによって、さらに多くのデータが取得されます。彼は次に何かを行い、私はajaxコールを行い、viewModelにデータをもう一度入力する代わりに "いっぱいに"データを埋めたいと思っています。これは、ユーザが何をするかに応じて、少なくとも2つのステップでviewModelを塗りたいという特殊なケースです(多分)。私は今、純粋なjavascriptでそれを解決しました。 – kaze

関連する問題