我々は、約5年間、私たちのasp.net MVC WebアプリケーションでPRGパターンを使用している:これは、ビューのコードです。私たちがPRGを採用した主な理由は、ブラウザのナビゲーション(バック、フォワードなど)をサポートすることでした。当社のWebアプリケーションは、顧客およびフロントオフィス/バックオフィスのオペレーションに使用されます。私たちの典型的なウェブページフローはログインから始まり、多くのリスト/詳細ビューを経て進んでいきます。また、独自のビューモデルも持つ部分ビューを組み込みます。リストビューにはナビゲーション用のリンク(GETS)があります。詳細ビューにはナビゲーション用のフォーム(POSTS)があります。
当社PRGのキー側面は:
- 我々はのviewmodelsを組み込むので、各ビューは、(すべてのデータアクセスがのviewmodelで行われている)のviewmodelを持っています。
- 各ビューモデルには、ビューの最新のインスタンスに関連付けられたキーデータフィールド値を維持するためのset()& get()メソッドがあります。 set/getの値は、sessionstateに保持されます。
- setメソッドには、設定する必要がある各値のパラメータがあります。 getメソッドは、viewmodelのpublic "key"値を設定するために、viewmodelコンストラクタから呼び出されます。
- viewmodelには、ビューのすべての必要データを取得するパブリックload()メソッドもあります。
当社PRGパターンの概要:私たちは別々のGETメソッドと各アクションのPOSTメソッドを持つコントローラで
- 。 GETはビューのみを表示します。 POSTは投稿されたデータを処理します。
- リスト(メニュー)ビューの場合、コントローラのGETメソッドはターゲットビューのセット(ここではアイテムキー値)メソッドを呼び出し、RedirectToActionを呼び出してターゲットビューのコントローラGETアクションを呼び出します。
- コントローラGETメソッドはviewmodelをインスタンス化し(set値を取得する)、set/getキー値を使用してデータを取得するloadメソッドを呼び出し、view/viewmodelを返します。
- コントローラPOSTメソッドは、有効な投稿データを保存してから、次の希望のページ(おそらく前のリストメニュー)にリダイレクトするか、またはデータが無効であれば現在のビューを再表示するかのいずれかを行います。
- 私が実装したすべてのPRGフローシナリオについては文書化していませんが、上記は基本フローです。
SAMPLEののViewModel SET/GET METHODS
private void GetKeys() {
Hashtable viewModelKeys;
if (SdsuSessionState.Exists("RosterDetail"))
{
viewModelKeys = (Hashtable)SdsuSessionState.Get("RosterDetail");
EventId = (int)viewModelKeys["EventId"];
SessionNo = (int)viewModelKeys["SessionNo"];
viewModelKeys = null;
}
}
public static void SetKeys(int eventId, int sessionNo) {
Hashtable viewModelKeys = new Hashtable();
viewModelKeys.Add("EventId",eventId);
viewModelKeys.Add("SessionNo",sessionNo);
SdsuSessionState.Set("RosterDetail",viewModelKeys);
viewModelKeys = null;
}
通常の練習は、ビューを返すことです
[AcceptVerbs("Get")]
public ActionResult MenuLink(int eventId, int sessionNo, string submitButton) {
if (submitButton == RosterMenu.Button.PrintPreview) {
// P-R-G: set called viewmodel keys.
RosterDetail.SetKeys(eventId,sessionNo);
// Display page.
return RedirectToAction("Detail","Roster");
}
if (submitButton == RosterMenu.Button.Export) { etc ...}
}
がModelState'は無効である 'された試料CONTROLLERその検証エラーメッセージので、が表示されます。 –
@StephenMuecke私は理解しています。しかし、POST要求がうまく掛かっているか、受け入れられていますか?つまり、リフレッシュすると、ブラウザの警告が表示されます。 – christianleroy
はい、それは少し痛みです。私はPRGパターンに従ういくつかの試みを見てきましたが、[このブログ](http://www.jefclaes.be/2012/06/persisting-model-state-when-using-prg)のように 'ModelState'を維持しています。あなたが '.keep()'や '.peek()'を使わない限り、失われたものをリフレッシュするなら、 'TempData'は使わないでください) –