1

私はPost-Redirect-Getパターンを使用しています。私のasp.netコアMVCのWebアプリで が、これは何が起こるかです:TempDataを使用せずにPOST要求が成功した後にリダイレクトした後にメッセージを表示

  1. ユーザーは、DBに項目を追加するPOSTを経由してフォームを送信します。
  2. コントローラは新しいアイテムを追加し、302/303のリダイレクトを "/ Home/Index/xxxx"にリダイレクトします(xxxxはアイテムのIDです)。
  3. 新しい要求(/ Home/Index/xxxx)がコントローラによって提供され、アイテムが表示されます。アドレスバーのアイテムのURLは、ユーザーがコピーして共有できるものです。

上記の手順3では、「Item added successfully」というメッセージを表示します。

これは(成功メッセージなし)私のコードです:

public async Task<IActionResult> Index(string id) 
{ 
    ItemView itemView = null; 
    if (string.IsNullOrEmpty(id)) 
     itemView = new ItemView(); // Create an empty item. 
    else 
     itemView = await itemService.GetItemAsync(id); 
    return View(itemView); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Index(ItemView itemView) 
{ 
    string id = await itemService.AddItemAsync(itemView); 
    return RedirectToAction("Index", "Home", new { id = id }); 
} 

私はstackoverflowの上の他の回答に見られるこれを行うには、いくつかの方法があります。

  1. "/ Home/Index/xxxx?success = true"にリダイレクトします。アクションがsuccess = true paramを見ると、成功メッセージが表示されます。しかし、ユーザーがアドレスバーからURLをコピーして共有できるようにするため、余分なパラメータを使用することは望ましくありません。また、共有リンクをクリックした人は誰もが「アイテムが正常に追加されました」というメッセージが表示されるため、成功するパラメータを持つURLを共有する必要はありません。
  2. このpostは、良い解決策であるTempDataを使用することを示唆しています。可能であれば、私が避けたいと思うサーバー上でスティッキーな動作を可能にするためには、私には必要だと思います。
  3. おそらくreferrer urlを使用して、リクエストがフォーム提出の後に来たかどうかを判断できます。この場合、メッセージを表示できます。
+0

ご使用のシナリオに応じて、私はTempDataを使用することをお勧めします。 – Dilip

+2

これを投票した人は、理由を説明するコメントを残してもよろしいですか?あまりにも多くのタグを使用しましたか?あるいは、その質問は重複のように見えますか?私は徹底的な研究を行い、一般的に提案されている解決策(およびリンクされたもの)のいくつかを列挙し、なぜ私がまだ答えを探しているのかを説明しました。そしてスヌーピーの答えは、私が正しい解決策を見つけるのを助けました。 – Turbo

+1

私は同様のジレンマにあった質問に同様の反応を示しました。私はその方法を知っていましたが、私はネットワークインフラストラクチャーのためにその方法のファンではなく、適切に実装する方法がわからない可能性のある選択肢からいくつかのアイディアを投げました。私は人々が "この人はどちらの方が良いかを尋ねているので、それは意見に基づくものであり、本当の質問ではない"と思っています。 「ちょっと、この男は少なくとも質問を投稿し、みんなに彼のためにそれを理解してもらう代わりに、可能な解決策を考えている」 –

答えて

1

「スヌーピー」による元の回答が正しい方向に向いています。しかし何らかの未知の理由のために、その答えはもはや存在しないので、将来私が誰かに恩恵を受けるであろうという希望で自分自身を投稿しています。

ASP .NET Core 1.1以降では、CookieTempDataProviderというCookieベースのTempdataプロバイダがサポートされています。 Microsoft Docsにリンクしてください。

これはセッションベースのTempdataに似ていますが、サーバー側にはデータは格納されていません。サーバーセットからの応答には、保存したいデータを持つブラウザーのクッキーがあります。ブラウザからの次のリクエストには、このCookieが含まれます。フレームワークは自動的にこれを解析し、コントローラが使用できるTempDataにこれを設定します。コントローラがこのデータを読み取ると、CookieTempDataProviderは自動的にレスポンスに適切なヘッダを追加してこのクッキーをクリアします。スタートアップクラスのConfigureServices法で

、あなたがCookieTempDataProvider登録する必要があります。クッキーに基づいて、一時データをいくつかのデータを格納するために

services.AddSingleton<ITempDataProvider, CookieTempDataProvider>(); 

を、あなたのコントローラでは、このようなあなたの簡単なセット値:

TempData["key"] = "value"; 

コントローラ内のデータを読み取るには、次のように読み取ります。

string value = TempData["key"]; 
if (value != null) 
{ 
    // Do something with the the value. 
} 

null以外のチェックは、そのキーがTempDataに存在するかどうかを示します。 .ContainsKey()メソッドを使ってチェックすることもできますが、それは読み込みとしてカウントされません。あなたがそれを読まない限り、データ(&クッキー)はクリアされません。たとえば、これでデータは消去されません。

if (TempData.ContainsKey("key")) 
{ 
// Do something without actually reading the value of TempData["key"]. 
} 
+0

ありがとう、非常に助けてください! – ygoe

関連する問題