3

TempDate["Message"]ユーザーが私のサイトで次のようなことをしているので、私は小さな更新バナーを表示するために使用しています。

[AcceptVerbs(HttpVerbs.Post), Authorize(Roles = "Admins")]
public ActionResult Delete(int id)
{
    _Repo.DeletePage(id); // soft-delete

    TempData["Message"] = "Page deleted!";
    return RedirectToAction("Revisions", "Page", new { id = id });
}

それから私のマスターページにこれがあります:

<%-- message box (show it only if it contains a message) --%>
<% string Message = (TempData["Message"] ?? ViewData["Message"]) as string; 

   if(!string.IsNullOrEmpty(Message)){
       %>
       <div id="message"><%:Message %></div>
   <% }

   TempData["Message"] = null; ViewData["Message"] = null; %>

TempDataはリダイレクトに使用されるべきであり、ViewDataはそれ以外の方法で使用されるべきであるとどこかで読んだので、TempDataとViewDataの両方をヒットしました。

問題は次のとおりです。多くの場合、メッセージはすぐには表示されません。メッセージが表示されるまでに、サイトのさまざまな部分に1、2回クリックする必要がある場合があります。とても不思議です。

何か案は?

4

5 に答える 5

2

コード内で使用するすべての場所を確認する必要がありますTempData["Message"]。ASP.NET MVCに対応しますか?ブラウザの更新によりTempDataは役に立たなくなりますか?読むことができるのはTempData["Message"]1回だけです(http://forums.asp.net/p/1528070/3694325.aspxも参照してください)。の最初の使用中に、TempData["Message"]TempData["Message"]内部から削除されTempDataDictionaryます。

おそらく、コントローラーのアクションのTempData["Message"]内部でのみ使用し、マスターページの内部やビューの内部では使用しない方がよいでしょう。RevisionsPage

于 2010-06-28T08:11:00.460 に答える
2

TempDataは、ビューにデータを渡すことを目的としていないため、その目的のためにViewDataという名前が付けられています。実際、ビュー定義内からTempDataを使用する理由はまったく考えられません...

TempDataの非常に一般的な使用法の1つは、リダイレクトを実行するときにコントローラーアクション間で情報を渡すことです(たとえば、上記の例のリビジョンアクションは、TempData["Message"]変数を利用できます)。

これは、MVCインタラクション(Post-Redirect-Get)をコーディングするPRG手段の一般的な方法です。これは、Redirect to the Getを実行するときに、最初のターゲットアクションから情報を渡す必要がある場合が多いためです。これがGetでどのように役立つかを示す例を以下に示します。ここでは、TempDataのリダイレクトから既に渡されたビューモデルがない限り、デフォルトで新しいビューモデルを使用することがよくあります。

public ActionResult System() {
   SystemAdminVM model = (SystemAdminVM)TempData["screenData"] ?? new SystemAdminVM();

もう一つ; ビュー内のTempDataおよびViewDataディクショナリエントリを明示的にクリアしているようです。その時点で彼らはとにかく彼らの寿命の終わりにいるので、あなたはそれをする必要はありません...

ハッピーコーディング!

于 2010-06-28T14:56:05.583 に答える
0

アプリの動作は、ViewDataを使用する必要がある場所でTempDataを使用している場合に予想される動作です。

コントローラがリダイレクトを行う場合にのみ、ステータスフィードバックをTempDataに保存していることを再確認する必要があります。それ以外の場合は、ViewDataを使用する必要があります。

于 2010-06-21T20:17:11.770 に答える
0

これは、表示されている動作を確認するために2、3の単体テストが必要なように聞こえます。この例を出発点として使用して、カップルを作成してみてください。

http://weblogs.asp.net/leftslipper/archive/2008/04/13/mvc-unit-testing-controller-actions-that-use-tempdata.aspx

于 2010-06-29T23:31:13.290 に答える
0

アプリケーションに複数のワーカープロセスを構成したが、セッション状態モードが「InProc」の場合、セッション状態が使用できなくなるため、デフォルトのTempData実装を使用できません。(ASP.NETセッションの状態と複数のワーカープロセスを参照してください)

代わりに、 MvcFuturesCookieTempDataProviderを使用してみてください。

于 2010-08-13T13:31:37.593 に答える