MVC ページが最初に読み込まれるときに、構造化データを MVC ページに渡しています。ユーザーが連絡先フォームを送信した後、同じデータを再利用したいので (同じページを「残す」だけです)、データベースに再度アクセスする必要はありません。モデルデータを格納するためにコントローラーにグローバル変数を宣言したのですが、ポストバックの最後でnullなのでそこで再利用できないようです。
これは典型的なシナリオのようです。どうすればそれを処理できますか?
MVC ページが最初に読み込まれるときに、構造化データを MVC ページに渡しています。ユーザーが連絡先フォームを送信した後、同じデータを再利用したいので (同じページを「残す」だけです)、データベースに再度アクセスする必要はありません。モデルデータを格納するためにコントローラーにグローバル変数を宣言したのですが、ポストバックの最後でnullなのでそこで再利用できないようです。
これは典型的なシナリオのようです。どうすればそれを処理できますか?
public ActionResult Foo()
{
var model = GetModelFromDB();
Return View(model);
}
[HttpPost]
public ActionResult Foo(Entity model)
{
Return View(model);
}
Asp.net-mvcはステートレスであるため、各HTTPリクエストには異なるコンテキストがあり、コントローラーにアクセスするたびに、コンストラクターですべてのデータがリセットされます。これが、を取得する理由ですnull
。
モデルのプロパティが送信されたフォーム内にある場合は、投稿でモデルを取得できます。
ポストバックの一部にならないビューモデルまたはその他の取得データを再利用したい場合は、次のいずれかを実行できます。
a)非表示フィールドに出力して、アクションに戻されるようにします(meh)または
b) オブジェクトをセッションに保存して、アプリケーション内の他のコントローラー/アクションで使用できるようにします。メモリが心配な場合は、再度使用する必要がなければ、再利用後にそのセッション変数を削除できます。
最初のページの読み込み時に、セッション変数が存在するかどうかを確認します。存在する場合は問題ありません。存在しない場合は入力します。
ああ、なぜグローバル変数が機能しないのか -> コントローラーはリクエストごとに新しく作成され(デフォルトのコントローラーファクトリーを使用すると仮定)、コントローラー内のグローバル変数はリクエストごとにリセットされます。
現在のページを離れたくない場合、および KMan が提案するように他のすべてのデータを投稿したくないが、ユーザーの連絡先情報/データを取得したい場合は、ajax を使用して連絡先情報を投稿できます。 .
ビュー モデルをメソッドの引数として使用している場合は、ポストバック時にそれをビューに返すことができます。元:
public ActionResult TestAction(MyViewModelType testViewModel)
{
//Do logic
return View("view",testViewModel);
}
投稿するフォーム内にデータが必要であることに注意してください。