SessionTempDataProvider和CookieTempDataProvider之间的不同行为

时间:2013-02-05 15:47:59

标签: asp.net-mvc session asp.net-mvc-4 tempdata

所有这些的简短版本是我使用TempData来存储反馈消息,并且在切换到使用CookieTempDataProvider之后,它们在使用PRG模式时不显示,但是如果我恢复到SessionTempDataProvider则会这样做。 / p>

在我的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),它充满了我的反馈信息,这很好。

UpdateFeedback

现在这默认工作,但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 is from here 的实现 显然它已被删除。

现在,当我尝试使用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的缺陷,或者我做错了什么?

0 个答案:

没有答案