ASP.NET MVC:跨多个请求保留 TempData

发布于 2024-07-22 06:35:29 字数 631 浏览 10 评论 0原文

当我执行重定向时,我需要传递一些值。 我想使用 TempData 来完成此任务,但遇到了问题。

我使用一个特殊的控制器来生成动态 JavaScript。 例如,可能有这样的脚本标签:

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

...但没有脚本文件“Login.js”。 相反,正在调用 ResourceController 的 Script 操作:

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

问题是,这会占用下一个请求,这意味着我无法使用 TempData 从具有动态脚本的页面进行重定向。 脚本操作(或整个 ResourceController)是否可以选择不使用 TempData,从而使其可用于下一个“真实”请求?

先感谢您!

There are values I need to pass when I perform redirects. I want to use TempData to accomplish this, but have encountered an issue.

I use a special controller to generate dynamic JavaScripts. For example, there might be a script tag like this:

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

...but there is no script file "Login.js." Instead, the Script action of the ResourceController is being called:

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

The problem is, this eats up the next request, meaning that I can't use TempData to redirect from a page with a dynamic script. Is there any way the script action (or the ResourceController as a whole) can choose not to consume the TempData, allowing it to be available for the next "real" request?

Thank you in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

如何视而不见 2024-07-29 06:35:29

Asp.Net 团队在 MVC 2 中通过引入 TempData.Keep() 消除了这一难题,这确保所有 TempData 项都被标记为可以再处理一次请求。 从您不希望使用 TempData 的所有操作中调用此方法。

请阅读 Jacques Eloffs 博客文章中引入 Keep() 的基本原理

MSDN 文档中的 Keep()

The Asp.Net team removed this pain in MVC 2, by introducing TempData.Keep(), which makes sure all TempData items are tagged to live for one more request. Call this from all actions you want not to eat TempData.

Read the rationale behind introducing Keep() in Jacques Eloffs blog post

Keep() in MSDN docs

双马尾 2024-07-29 06:35:29

放置该行

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

您可以在视图中使用 TempData 之后

。 本文也可能对您有用: ASP.NET MVC TempData 确实是 RedirectData

You could place the line

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

after using TempData in view.

This article could also be useful for you: ASP.NET MVC TempData Is Really RedirectData

人│生佛魔见 2024-07-29 06:35:29

会话在多个请求之间保留。

Session is preserved between multiple requests.

没企图 2024-07-29 06:35:29

让您的控制器超类型覆盖 ExecuteCore,这会清除 TempData。 我并不是说这是一个好主意......

protected override void ExecuteCore()
{
    string actionName = RouteData.GetRequiredString("action");
    if (!ActionInvoker.InvokeAction(ControllerContext, actionName))
    {
        HandleUnknownAction(actionName);
    }
}

Have your controller supertype override ExecuteCore, which clears TempData. I'm not saying this is a good idea...

protected override void ExecuteCore()
{
    string actionName = RouteData.GetRequiredString("action");
    if (!ActionInvoker.InvokeAction(ControllerContext, actionName))
    {
        HandleUnknownAction(actionName);
    }
}
源来凯始玺欢你 2024-07-29 06:35:29

为什么不创建一个 PreserveTempDataAttribute 来装饰您的脚本操作。 如果 TempData 不为空,它可以重新分配它。

Why not create a PreserveTempDataAttribute that you can decorate your Script action with. It can re-assign the TempData if it is not null.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文