2

我已经通过 web.config 在我的 mvc2 应用程序中禁用了 sessionState,并且还创建了我自己的 controllerfactory 和虚拟临时数据提供程序,如下所述:

如何在 ASP.NET MVC 中禁用会话状态?

只有我做到了,所以 SaveTempData 抛出异常:

 public void SaveTempData(ControllerContext controllerContext, 
                          IDictionary<string, object> values)
    {
        throw new NotImplementedException(
        "Cannot set tempdata, no session state is available.");
    }

我已确保没有代码使用过 Session 或 TempData 对象,但我仍然看到在引发“OnResultExecuted”事件后引发了此异常。我曾经在我的 mvc1 站点上使用过同样的模式,但从未见过异常。有任何想法吗?

如果我将“SaveTempData”实现更改为:

public void SaveTempData(ControllerContext controllerContext, 
                         IDictionary<string, object> values)
    {
        if (values.Count != 0)
        {
            throw new NotImplementedException(
            "Cannot set tempdata, no session state is available.");
        }
    }

一切都按预期工作-我只是希望了解为什么在我不在任何地方使用 SaveTempData 时会调用它。

更新

发现这篇文章:http ://www.gregshackles.com/2010/07/asp-net-mvc-do-you-know-where-your-tempdata-is/

这解释了 ExecuteCore 围绕一个操作调用 PossiblyLoadTempData 和 PossiblySaveTempData - 这就是导致我的问题的原因。这是 mvc2 与 mvc1 的新增功能吗?

4

2 回答 2

1

这就是它在方法中的实现Controller.ExecuteCore方式。LoadTempDataand方法将SaveTempData始终在每个操作之前和之后调用,因此请确保它们不会引发异常。为了有效地禁用会话,我建议您在 web.config 中添加以下内容:

<sessionState mode="Off" />
于 2011-04-01T20:01:01.597 回答
1

发现这篇文章:http ://www.gregshackles.com/2010/07/asp-net-mvc-do-you-know-where-your-tempdata-is/

这解释了 ExecuteCore 围绕一个操作调用 PossiblyLoadTempData 和 PossiblySaveTempData - 这就是导致我的问题的原因。这是 mvc2 与 mvc1 的新增功能吗?

于 2011-04-01T20:05:52.307 回答