2017-07-05 9 views
0

レコードを作成して保存できるページがあります。 [保存]をクリックすると、同じページにとどまりますが、そのページに更新されたビューモデルが表示されます。私が抱えている問題は、保存した後、GETのパラメータがページURLにとどまることです。ページを再表示した後にURLパラメータを削除します

アプリケーションを実行すると、「リストレコード」ページに移動し、「新規作成」ボタンをクリックします。その結果、GETの要求がEditRecordになり、createNewパラメータがtrueに設定されます。私は、更新されたページが更新されたビューモデルで正しく表示されている。この方法にPOST

[HttpPost] 
public ActionResult EditRecord(MyRecordViewModel viewModel) 
{ 
    // Save record to database 
    // ... 

    // Update the view model 
    viewModel.LastUpdatedDttm = DateTime.Now; 

    // Clear the model state dictionary so that my updated view model's values will be shown on the page 
    ModelState.Clear(); 

    // Go back to the same page with an updated view model 
    return View(viewModel); 
} 

、それを保存]をクリックすると、要求はその後localhost/Home/EditRecord?createNew=True

public ActionResult EditRecord(string id, bool createNew = false) 
{ 
    MyRecordViewModel viewModel; 
    if (createNew) 
    { 
     viewModel = new MyRecordViewModel 
     { 
      IsNew = true 
     }; 
    } 
    else 
    { 
     var myRecord = (from p in this.context.MyRecords 
         where p.Id = id 
         select p).FirstOrDefault(); 
     if (myRecord == null) 
     { 
      this.ErrorMessage("Cannot find record."); 
      return View(); 
     } 
     viewModel = new MyRecordViewModel(myRecord); 
    } 

    return View(viewModel); 
} 

のように見えます。問題は、URLがまだlocalhost/Home/EditRecord?createNew=Trueであることです。私はそれが再表示するために、データベースへの不必要な旅行を引き起こしますので、私は、私のレコードIDで偽に等しいcreateNewGETページに戻ってリダイレクトするようにしたくないURLがlocalhost/Home/EditRecord

になりたいです同じレコード。

+0

私はあなたが保存に成功した後、GETアクションにリダイレクトPRGパターンに従ってください示唆しています。あなたはPRGパターンをするときに何の問題がありますか? – Shyju

+0

'GET'部分には、すでに利用可能なデータを選択するためのデータベースへの移動は含まれていませんか?私は不必要なデータベースアクセスを避けようとしています。 –

+0

です。それはGETのデータベースから新鮮なものを読むためのきれいなアプローチかもしれません。なぜあなたは単一のデータベースヒットについて心配しますか? – Shyju

答えて

1

PRG(ポストリダイレクト - 取得)パターンを使用する必要があります。単に、あなたが正常にあなたの編集などを行った後で、再びビューを返さず、代わりにリダイレクトを返します。同じページを再度ロードする場合は、同じページにリダイレクトしてください。キーは、リダイレクトを行うことで、URLのようなものを持ち越さずに、すべてのものを新しく読み込んでいます。これはまた、ModelState.Clear()のような反パターンを行う必要性を否定します。

+0

私は 'GET'が私のデータベースに私の' POST'の中ですでに利用可能なデータを選択する別の旅行を伴うので、私はそれを避けようとしていました。私はPRGを間違って実装していますか? –

+0

そして?マイクロ最適化の試みでは、別の方法で機能する一連の機能を壊しました。クエリを再発行する必要がある場合は、それを行います。それは本当に大きな問題ではありません。クエリが長すぎる場合は、クエリを最適化するか、データベースに多くのリソースを投げてください。また、メモリーキャッシングを使用してラウンドトリップを回避することもできます。 –

0
public ActionResult EditRecord(string id, bool createNew = false) 
{ 
    id = id ?? TempData["id"]; 

    //your code 
} 


[HttpPost] 
public ActionResult EditProductAlias(MyRecordViewModel viewModel) 
{ 
    //your code 

    TempData[id] = viewModel.Id; 

    return RedirectToAction("EditRecord", "ControllerName") 
} 

しかし、それは非常に悪いソリューション

関連する問題