Asp.net mvc SessionTempDataProvider和CookieTempDataProvider之间的不同行为

Asp.net mvc SessionTempDataProvider和CookieTempDataProvider之间的不同行为,asp.net-mvc,session,asp.net-mvc-4,tempdata,Asp.net Mvc,Session,Asp.net Mvc 4,Tempdata,所有这些的简短版本是,我使用TempData存储反馈消息,在切换到使用CookieTempDataProvider后,它们在使用PRG模式时不会显示,但如果我返回到SessionTempDataProvider,它们会显示 在我的MVC4应用程序中,我有一种模式,即在成功创建/更新后,或者当某些页面出现问题时,我需要向临时数据写入警报消息,以便在屏幕上显示。例如 [HttpPost, ValidateAntiForgeryToken] public ActionResult Edit(Peopl

所有这些的简短版本是,我使用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的不同实现来避免没有会话。我必须使用不同的tempdataProvider,因为如果我禁用会话而不更改TempData的实现,第一次尝试使用它时,我将得到一个InvalidOperationException

SessionStateTempDataProvider类要求会话状态为 启用

但是如果我忽略PRG模式,而是这样做,那么我会看到我的反馈

TempData["message"] = "Person successfully updated.";
TempData["messageType"] = "success"
return View("Edit", person);

因此,我的问题是,普遍接受的CookieTempDataProvider是否存在缺陷,或者我是否做错了什么?

也许可以帮助你:我已经研究了这个问题(以及其他一些问题),也搜索了谷歌,但这些问题似乎都与我在应用PRG模式时的反复无常行为问题无关。我曾假设MvcContrib库中包含的CookieTempDataProvider(我相信这是该源代码的目的)将是完全功能的,但我想验证在我放弃它,转而尝试重新发明轮子之前,是否是该提供程序或我对它的使用导致了这种行为。我无法想象我是唯一遇到这个问题的人?我使用完全相同的模式,但我使用cookietempdataprovider的这个实现:对我来说很好。
//I have tried this with and without the HttpContextScoped()
For<ITempDataProvider>().HttpContextScoped().Use<CookieTempDataProvider>();
For<HttpContextBase>().HttpContextScoped().Use(x => new HttpContextWrapper(HttpContext.Current));
TempData["message"] = "Person successfully updated.";
TempData["messageType"] = "success"
return RedirectToAction("Details", new { id = person.ObjectId });
TempData["message"] = "Person successfully updated.";
TempData["messageType"] = "success"
return View("Edit", person);