2

リダイレクトを実行するときに渡す必要がある値があります。これを実現するために TempData を使用したいのですが、問題が発生しました。

特別なコントローラーを使用して動的 JavaScript を生成します。たとえば、次のようなスクリプト タグがあるとします。

<script type="text/javascript" src="/Resource/Script/Login.js"></script>

...しかし、スクリプトファイル「Login.js」はありません。代わりに、ResourceController のスクリプト アクションが呼び出されます。

public class ResourceController : Controller {
    public ActionResult Script(string id) {
        // set script = some code
        return JavaScript(script);
    }
}

問題は、これが次のリクエストを食い尽くすことです。つまり、TempData を使用して動的スクリプトを含むページからリダイレクトすることはできません。スクリプト アクション (または ResourceController 全体) が TempData を消費しないことを選択して、次の「実際の」要求で使用できるようにする方法はありますか?

前もって感謝します!

4

5 に答える 5

8

Asp.Net チームは、TempData.Keep() を導入することで、MVC 2 でこの問題を取り除きました。これにより、すべての TempData 項目が、もう 1 つの要求に対してライブになるようにタグ付けされます。TempData を食べたくないすべてのアクションからこれを呼び出します。

Jacques Eloffs のブログ投稿で、Keep() を導入した理由を読んでください。

MSDN ドキュメントの Keep()

于 2011-05-25T08:09:34.910 に答える
5

あなたはラインを置くことができます

<script type="text/javascript" src="/Resource/Script/Login.js"></script>

ビューでTempDataを使用した後。

この記事はあなたにも役立つかもしれません:ASP.NETMVCTempDataは本当にRedirectDataです

于 2009-05-27T09:07:03.863 に答える
4

セッションは複数のリクエスト間で保持されます。

于 2009-05-27T09:02:27.757 に答える
2

コントローラーのスーパータイプで ExecuteCore をオーバーライドし、TempData をクリアします。私はこれが良い考えだと言っているのではありません...

protected override void ExecuteCore()
{
    string actionName = RouteData.GetRequiredString("action");
    if (!ActionInvoker.InvokeAction(ControllerContext, actionName))
    {
        HandleUnknownAction(actionName);
    }
}
于 2009-05-27T11:02:47.127 に答える
0

スクリプト アクションを装飾できる PreserveTempDataAttribute を作成してみませんか。null でない場合は、TempData を再割り当てできます。

于 2010-08-11T14:05:15.487 に答える