1

MVC ページが最初に読み込まれるときに、構造化データを MVC ページに渡しています。ユーザーが連絡先フォームを送信した後、同じデータを再利用したいので (同じページを「残す」だけです)、データベースに再度アクセスする必要はありません。モデルデータを格納するためにコントローラーにグローバル変数を宣言したのですが、ポストバックの最後でnullなのでそこで再利用できないようです。

これは典型的なシナリオのようです。どうすればそれを処理できますか?

4

4 に答える 4

4
public ActionResult Foo()
{
    var model = GetModelFromDB();
    Return View(model);
}

[HttpPost]
public ActionResult Foo(Entity model)
{
    Return View(model);
}

Asp.net-mvcはステートレスであるため、各HTTPリクエストには異なるコンテキストがあり、コントローラーにアクセスするたびに、コンストラクターですべてのデータがリセットされます。これが、を取得する理由ですnull

モデルのプロパティが送信されたフォーム内にある場合は、投稿でモデルを取得できます。

于 2012-01-19T19:47:33.597 に答える
4

ポストバックの一部にならないビューモデルまたはその他の取得データを再利用したい場合は、次のいずれかを実行できます。

a)非表示フィールドに出力して、アクションに戻されるようにします(meh)または

b) オブジェクトをセッションに保存して、アプリケーション内の他のコントローラー/アクションで使用できるようにします。メモリが心配な場合は、再度使用する必要がなければ、再利用後にそのセッション変数を削除できます。

最初のページの読み込み時に、セッション変数が存在するかどうかを確認します。存在する場合は問題ありません。存在しない場合は入力します。

ああ、なぜグローバル変数が機能しないのか -> コントローラーはリクエストごとに新しく作成され(デフォルトのコントローラーファクトリーを使用すると仮定)、コントローラー内のグローバル変数はリクエストごとにリセットされます。

于 2012-01-19T19:42:24.230 に答える
0

現在のページを離れたくない場合、および KMan が提案するように他のすべてのデータを投稿したくないが、ユーザーの連絡先情報/データを取得したい場合は、ajax を使用して連絡先情報を投稿できます。 .

于 2012-01-19T20:24:30.390 に答える
-1

ビュー モデルをメソッドの引数として使用している場合は、ポストバック時にそれをビューに返すことができます。元:

public ActionResult TestAction(MyViewModelType testViewModel)
{
   //Do logic

    return View("view",testViewModel);

}

投稿するフォーム内にデータが必要であることに注意してください。

于 2012-01-19T19:42:22.167 に答える