所有这一切的简短版本是我正在使用 TempData 来存储反馈消息,并且在切换到使用 CookieTempDataProvider 后,它们在使用 PRG 模式时不会出现,但是如果我恢复到 SessionTempDataProvider 他们会出现。
在我的 MVC4 应用程序中,我有一种模式,即在成功创建/更新后或当某些页面出现问题并且我需要显示失败消息时,将警告消息写入临时数据以显示在屏幕上。例如...
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Edit(PeopleEditFormModel model)
{
if (!ModelState.IsValid)
return RedirectToAction("Edit", new { id = model.ObjectId });
try
{
var person = personService.UpdatePerson(model); // personService is set via DI in constructor
TempData["message"] = "Person successfully updated.";
TempData["messageType"] = "success"
return RedirectToAction("Details", new { id = person.ObjectId });
}
catch (DomainException ex)
{
//For putting business logic errors in the ModelState
ModelState.AddModelError(string.Empty, ex.Message);
return RedirectToAction("Edit", new {id = model.ObjectId});
}
}
我有一个由我的 _Layout.cshtml 文件调用的部分视图,该文件基本上是一个占位符 DIV 元素(加上一些 js),其中填充了我的反馈消息,这很好用。
现在默认情况下这是可行的,但 TempData 依赖于会话,如果可能,我想禁用它并使用 TempDataProvider 的不同实现来解决没有会话的问题。我必须使用不同的 TempDataProvier,因为如果我禁用会话而不更改 TempData 的实施,我第一次尝试使用它时会得到一个 InvalidOperationException 说明
SessionStateTempDataProvider 类需要启用会话状态。
<system.web>
<sessionState mode="Off"/>
</system.web>
我已经用我的 Dependency Injector,StructureMap 注册了一个新组件,它看起来像这样。
//I have tried this with and without the HttpContextScoped()
For<ITempDataProvider>().HttpContextScoped().Use<CookieTempDataProvider>();
For<HttpContextBase>().HttpContextScoped().Use(x => new HttpContextWrapper(HttpContext.Current));
我应该提一下我对 CookieTempDataProvider的实现来自这里
显然它已被删除。
现在,当我现在尝试使用 TempData 但我的反馈没有出现时,这解决了异常。我想也许我在努力中破坏了一些东西,所以我注释掉了我的 DI 行并将我的会话状态模式改回InProc
,并对其进行了测试。我的反馈按预期显示(重新启动 IISExpress 后)。我取消注释我的注入行,将会话状态更改为Off
,然后我又没有反馈了。
我做了一些进一步的测试,发现如果我在操作中执行以下操作,我不会收到任何消息
TempData["message"] = "Person successfully updated.";
TempData["messageType"] = "success"
return RedirectToAction("Details", new { id = person.ObjectId });
但是,如果我忽略 PRG 模式,而是这样做,那么我会看到我的反馈。
TempData["message"] = "Person successfully updated.";
TempData["messageType"] = "success"
return View("Edit", person);
所以我的问题是,普遍接受的 CookieTempDataProvider 是否存在缺陷,或者我做错了什么?