Я хочу использовать TempData для хранения сообщений между Post и последующей переадресацией, но TempData всегда пустые.TempData всегда пуст
У меня есть BaseContoller, предлагающий некоторую инфраструктуру для передачи TempData. Упрощенный код выглядит следующим образом:
public abstract class BaseController : Controller
{
public const string AuditMessagesKey = "AuditMessages";
private List<InformationMessage> _informationMessages = new List<InformationMessage>();
protected BaseController()
{
// I also tried this in overriden Initialize
ViewData[AuditMessagesKey] = GetAuditMessages();
}
protected void AddAuditMessage(InformationMessage message)
{
if (message == null)
return;
_informationMessages.Add(message);
}
protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
if (filterContext.Result is RedirectToRouteResult)
{
// I see that messages are stored into TempData
TempData[AuditMessagesKey] = _informationMessages;
// This also doesn't help
// TempData.Keep(AuditMessagesKey);
}
}
private ICollection<InformationMessage> GetAuditMessages()
{
// TempData are always empty here
var messages = TempData[AuditMessagesKey] as List<InformationMessage>;
if (messages == null)
{
messages = new List<InformationMessage>();
}
return messages;
}
}
метод действий выглядит следующим образом:
[HttpPost]
public ActionResult CancelEdit(RequestSaveModel model)
{
AddAuditMessage(new InformationMessage
{
Message = String.Format(Messages.RequestEditationCanceled, model.Title),
Severity = MessageSeverity.Information
});
return RedirectToAction("Detail", new { Id = model.Id});
}
Применение тестируется на веб-сервере VS развития. Нет вызовов Ajax, и я удалил все вызовы Html.RenderAction со своей главной страницы. Я вижу, что TempData обращаются только один раз за запрос в GetAuditedMessages и сохраняются только один раз в OnResultExecuting. Ничто не перезаписывает данные. Состояние сеанса разрешено.
Код немного упрощен. Мы также используем маркер antiforgery, пользовательские фильтры для авторизации и выбора действия, но не должны влиять на поведение TempData.
Я не понимаю. Я использовал TempData раньше в тестовом приложении, и он работал нормально.
Я поддерживаю код, который мог быть скопирован и вставлен из вашего вопроса, а TempData всегда возвращается пустым .. arg. –