ASP.NET MVC: сохранение данных TempData для нескольких запросов - PullRequest
2 голосов
/ 27 мая 2009

Есть значения, которые мне нужно передать при выполнении перенаправлений. Я хочу использовать TempData для этого, но столкнулся с проблемой.

Я использую специальный контроллер для генерации динамических скриптов Java. Например, может быть такой скрипт-тег:

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

... но нет файла сценария "Login.js." Вместо этого вызывается действие Script ResourceController:

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

Проблема в том, что это съедает следующий запрос, что означает, что я не могу использовать TempData для перенаправления со страницы с динамическим сценарием. Есть ли способ, которым действие скрипта (или ResourceController в целом) может не использовать TempData, что позволяет ему быть доступным для следующего «реального» запроса?

Заранее спасибо!

Ответы [ 5 ]

8 голосов
/ 25 мая 2011

Команда Asp.Net устранила эту проблему в MVC 2, введя TempData.Keep (), который гарантирует, что все элементы TempData помечены для поддержки еще одного запроса. Вызывайте это из всех действий, которые вы хотите , а не , чтобы съесть TempData.

Прочитайте обоснование введения Keep () в Жак Элоффс в блоге

Сохранить () в документах MSDN

5 голосов
/ 27 мая 2009

Вы можете разместить линию

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

после использования TempData в представлении.

Эта статья также может быть полезна для вас: Данные ASP.NET MVC TempData действительно перенаправлены

4 голосов
/ 27 мая 2009

Сеанс сохраняется между несколькими запросами.

2 голосов
/ 27 мая 2009

Имейте переопределение супертипа вашего контроллера ExecuteCore, который очищает TempData. Я не говорю, что это хорошая идея ...

protected override void ExecuteCore()
{
    string actionName = RouteData.GetRequiredString("action");
    if (!ActionInvoker.InvokeAction(ControllerContext, actionName))
    {
        HandleUnknownAction(actionName);
    }
}
0 голосов
/ 11 августа 2010

Почему бы не создать атрибут PreserveTempDataAttribute, которым можно украсить действие Script. Он может переназначить TempData, если он не нулевой.

...