我想有一个非常轻量级的ASP.NET MVC站点,其中包括尽可能多地删除常用的HttpModule并禁用会话状态.但是,当我尝试这样做时,我收到以下错误:
The SessionStateTempDataProvider requires SessionState to be enabled.
我在web.config中禁用了会话状态:
我知道ASP.NET MVC使用TempData的会话状态,但我不需要/想要TempData - 我只是想禁用会话状态.救命!
您可以创建自己的ControllerFactory和DummyTempDataProvider.像这样的东西:
public class NoSessionControllerFactory : DefaultControllerFactory { protected override IController GetControllerInstance(Type controllerType) { var controller = base.GetControllerInstance(controllerType); ((Controller) controller).TempDataProvider = new DummyTempDataProvider(); return controller; } } public class DummyTempDataProvider : ITempDataProvider { public IDictionaryLoadTempData(ControllerContext controllerContext) { return new Dictionary (); } public void SaveTempData(ControllerContext controllerContext, IDictionary values) { } }
然后你只需要在app启动时注册控制器工厂 - 例如你可以在global.asax中执行此操作:
ControllerBuilder.Current.SetControllerFactory(new NoSessionControllerFactory());
我找到了一种方法,我并不特别关心:
创建NoTempDataProvider
using System; using System.Collections.Generic; using System.Web.Mvc; namespace Facebook.Sites.Desktop.Auth.Models { public class NoTempDataProvider : ITempDataProvider { #region [ ITempDataProvider Members ] public IDictionaryLoadTempData(ControllerContext controllerContext) { return new Dictionary (); } public void SaveTempData(ControllerContext controllerContext, IDictionary values) { } #endregion } }
手动覆盖Controller中的提供程序
public class AuthController : Controller { public AuthController() { this.TempDataProvider = new NoTempDataProvider(); } }
我非常喜欢通过配置完全做到这一点的方法,但现在这种方法很有用.
如果您需要将TempData用于简单字符串,则可以使用MvcFutures中的CookieTempDataProvider http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471.