2016-04-22 37 views
2

私はASP.Net MVCを初めて使っています。 PHPでは、ポストリクエストが無効であっても常にPRGパターンを使用します。セッションのフラッシュ(ユーザーフレンドリー)でもかなり簡単でした。ASP.Net MVCのPRGパターン?

しかし、ASP.Net MVCでは、リクエストが無効な場合にPRGを実行する簡単な方法はありません。私はいくつかの方法を考えることができましたが、私は彼らが良い習慣であるとは思わないし、余計な不必要な作業を加えることもあります。

また、私が読んだ記事のいくつかから、リクエストが無効だったときのPRGはお勧めできませんでした。悪い習慣であれば、失敗した投稿リクエストを処理するにはどうすればよいでしょうか? PRGがなければ本当に良いですか?そして、ユーザーがページを更新しようとすると、ちょっと迷惑なブラウザの警告を出さなければなりませんか? MVCでは

+1

がModelState'は無効である 'された試料CONTROLLERその検証エラーメッセージので、が表示されます。 –

+0

@StephenMuecke私は理解しています。しかし、POST要求がうまく掛かっているか、受け入れられていますか?つまり、リフレッシュすると、ブラウザの警告が表示されます。 – christianleroy

+0

はい、それは少し痛みです。私はPRGパターンに従ういくつかの試みを見てきましたが、[このブログ](http://www.jefclaes.be/2012/06/persisting-model-state-when-using-prg)のように 'ModelState'を維持しています。あなたが '.keep()'や '.peek()'を使わない限り、失われたものをリフレッシュするなら、 'TempData'は使わないでください) –

答えて

0

、それは次のようにあなたのポストのアクションを処理するため、通常の練習です:

[HttpPost] 
[ValidateAntiForgeryToken] 
public virtual ActionResult LoginForm(LoginViewModel loginViewModel) 
{ 
    if (!ModelState.IsValid) 
     return View("Login", loginViewModel); 

    return Redirect("/"); 
} 

あなたが見ることができるように、要求が無効である場合、プロパティModelState.IsValidは、したがって、あなたの能力を与えて、あなたを教えてくれますポストリクエストにエラーが含まれている場合、同じビューを返し、ValidationSummaryにエラーメッセージを表示します。

@using (Html.BeginForm("LoginForm", "Account"})) 
    { 
     @Html.ValidationSummary() // THIS WILL SHOW THE ERROR MESSAGES 
     @Html.AntiForgeryToken() 
     @Html.TextBoxFor(x => x.Email) 
     @Html.PasswordFor(x => x.Password) 
     <button type="submit">Submit</button> 
    } 
-1

我々は、約5年間、私たちのasp.net MVC WebアプリケーションでPRGパターンを使用している:これは、ビューのコードです。私たちがPRGを採用した主な理由は、ブラウザのナビゲーション(バック、フォワードなど)をサポートすることでした。当社のWebアプリケーションは、顧客およびフロントオフィス/バックオフィスのオペレーションに使用されます。私たちの典型的なウェブページフローはログインから始まり、多くのリスト/詳細ビューを経て進んでいきます。また、独自のビューモデルも持つ部分ビューを組み込みます。リストビューにはナビゲーション用のリンク(GETS)があります。詳細ビューにはナビゲーション用のフォーム(POSTS)があります。

当社PRGのキー側面は:

  1. 我々はのviewmodelsを組み込むので、各ビューは、(すべてのデータアクセスがのviewmodelで行われている)のviewmodelを持っています。
  2. 各ビューモデルには、ビューの最新のインスタンスに関連付けられたキーデータフィールド値を維持するためのset()& get()メソッドがあります。 set/getの値は、sessionstateに保持されます。
  3. setメソッドには、設定する必要がある各値のパラメータがあります。 getメソッドは、viewmodelのpublic "key"値を設定するために、viewmodelコンストラクタから呼び出されます。
  4. viewmodelには、ビューのすべての必要データを取得するパブリックload()メソッドもあります。

当社PRGパターンの概要:私たちは別々のGETメソッドと各アクションのPOSTメソッドを持つコントローラで

  1. 。 GETはビューのみを表示します。 POSTは投稿されたデータを処理します。
  2. リスト(メニュー)ビューの場合、コントローラのGETメソッドはターゲットビューのセット(ここではアイテムキー値)メソッドを呼び出し、RedirectToActionを呼び出してターゲットビューのコントローラGETアクションを呼び出します。
  3. コントローラGETメソッドはviewmodelをインスタンス化し(set値を取得する)、set/getキー値を使用してデータを取得するloadメソッドを呼び出し、view/viewmodelを返します。
  4. コントローラPOSTメソッドは、有効な投稿データを保存してから、次の希望のページ(おそらく前のリストメニュー)にリダイレクトするか、またはデータが無効であれば現在のビューを再表示するかのいずれかを行います。
  5. 私が実装したすべての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 ...} 
} 
関連する問題