2

所有这一切的简短版本是我正在使用 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 是否存在缺陷,或者我做错了什么?

4

0 回答 0